Dobrý den, pane Jirsáku,
měl jste pravdu takhle jednoduše opravdu nevypadal. Metoda
vracející Set<String> byla definována v generickém rozhraní. Takže
tedy znovu:
Zdroj:
interface TableModel<T> {
public Set<String> getModelColumnNames();
// ...a další methody využívajích parametr T
}
class JpaTableModel<T> implements TableModel<T> {
public Set<String> getModelColumnNames() {
// něco
}
}
Použití s odkazováním se na rozhraní:
TableModel model = new JpaTableModel();
mode.getModelColumnNames(); // návratový typ Set, ne Set<String>
Stejně tak odkazování se přímo na implementaci:
JpaTableModel model = new JpaTableModel();
mode.getModelColumnNames(); // návratový typ Set, ne Set<String>
Vždy je návratový typ jen Set. Musím tedy vždy konvertovat zpátky na
Set<String>:
Set<String> names = ejModel.getModelColumnNames();
To ale vypisuje varování:
warning: [unchecked] unchecked conversion
found : java.util.Set
required: java.util.Set<java.lang.String>
Set<String> names = ejModel.getModelColumnNames();
Nevím proč, ale odstranění typového parametru z rozhraní najednou vše
vyřeší a již se z implementace vrací typovaný Set.
interface TableModel { // <<<---- původně mělo <T>
public Set<String> getModelColumnNames();
}
class JpaTableModel implements TableModel {
public Set<String> getModelColumnNames() {
// něco
}
}
Proč typový parametr v rozhraní vadí? Je to bug nebo vlastnost?
--
Libor
Dne 13. září 2011 16:42 Filip Jirsák <[email protected]> napsal(a):
> Dobrý den,
> myslím, že váš kód ve skutečnosti vypadá jinak a že jste při jeho
> zjednodušování problém odstranil. Zkuste si přeložit to, co jste poslal, a
> předpokládám, že to bude bez unchecked varování. Pravděpodobně voláte jinou
> metodu nebo na jiné třídě/rozhraní, a ta volaná metoda vrací „starý“ Set.
> S pozdravem
>
> Filip Jirsák
>
>
> Dne 13. září 2011 16:16 Libor Jelinek <[email protected]> napsal(a):
>>
>> Dobrý den, milý kolegové!
>>
>> Zdroj:
>> class JpaTableModel {
>> public Set<String> getModelColumnNames() {
>> // něco
>> }
>> }
>>
>> Použití:
>> model = new JpaTableModel();
>> mode.getModelColumnNames(); // návratový typ Set, ne Set<String>
>>
>> Ovšem, kde getModelColumnNames() má návratový typ pouhý Set. *Proč*?
>>
>> Musím tedy vždy konvertovat zpátky do Set<String>:
>> Set<String> names = ejModel.getModelColumnNames();
>>
>> To ale vypisuje varování:
>> warning: [unchecked] unchecked conversion
>> found : java.util.Set
>> required: java.util.Set<java.lang.String>
>> Set<String> names = ejModel.getModelColumnNames();
>>
>> Ale je to jediná mně známá cesta, jak dál moci pracovat "type-safe".
>> Je to však zase nějaké omezení generik nebo něco dělám/chápu špatně?
>> Čekám že to bude něco s erasure, ale neumím si sám odpovědět.
>>
>> Mockrát děkuji za rady.
>> Libor
>
>