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
>
>

Odpovedet emailem