2013-04-03 5 views
34

Ho un metodo che restituisce una raccolta di una classe di base:C'è un modo per forzare il tipo di ritorno di Arrays.asList

import java.util.*; 
class Base { } 
class Derived extends Base { } 

Collection<Base> getCollection() 
{ 
    return Arrays.asList(new Derived(), 
         new Derived()); 
} 

Questo non riesce a compilare, come il tipo di ritorno di Arrays.asList (List<Derived>) fa non corrisponde al tipo restituito del metodo (Collection<Base>). Capisco perché ciò accade: poiché i tipi generici sono diversi, le due classi non sono correlate per ereditarietà.

Ci sono molti modi per correggere l'errore del compilatore cambiando il tipo di ritorno del metodo per non usare Arrays.asList per lanciare uno degli oggetti derivati ​​su Base.

C'è un modo per dire al compilatore di usare un tipo diverso ma compatibile quando risolve il tipo generico per la chiamata Arrays.asList? (Continuo a cercare di utilizzare questo modello e in esecuzione in questo problema, quindi se c'è un modo per farlo funzionare, mi piacerebbe saperlo.)

ho pensato che si potrebbe fare qualcosa di simile

Collection<Base> getCollection() 
{ 
    return Arrays.asList<Base>(new Derived(), 
           new Derived()); 
} 

Quando provo a compilarlo (java 6), il compilatore si lamenta che si aspetta un ')' alla virgola.

+3

Array. asList –

risposta

47

La sintassi è quasi corretta; il <Base> va prima che il nome del metodo:

return Arrays.<Base>asList(new Derived(), 
          new Derived()); 

Java 8

Per Java 8, con la sua improved target type inference, il tipo di argomento esplicito non è necessario. Poiché il tipo restituito del metodo è Collection<Base>, il parametro type sarà dedotto come Base.

return Arrays.asList(new Derived(), 
        new Derived()); 

Il parametro di tipo esplicito è ancora necessario per Java 7 e versioni successive. È ancora possibile fornire il parametro di tipo esplicito in Java 8; è facoltativo.

+0

Wow, mai sentito parlare di questo –

+0

Ci sono casi in Java 8 dove è necessario fornire il parametro. Mi sono imbattuto in questo facendo cose come 'MyClass. builder(). SomeMethodWithGenericSignature (derivato) 'o qualcosa di simile. –

Problemi correlati