Chiamata di metodi generici statici


106

Mi sono imbattuto in una situazione curiosa che coinvolge metodi generici statici. Questo è il codice:

class Foo<E>
{
    public static <E> Foo<E> createFoo()
    {
        // ...
    }
}

class Bar<E>
{
    private Foo<E> member;

    public Bar()
    {
        member = Foo.createFoo();
    }
}

Come mai non devo specificare alcun tipo di argomento nell'espressione Foo.createFoo()? È una sorta di inferenza di tipo? Se voglio essere esplicito al riguardo, come posso specificare l'argomento tipo?


7
Ti consiglierei di cambiare il parametro di tipo E del metodo createFoo. Perché il parametro di tipo E della classe Foo è diverso dal parametro di tipo E del metodo createFoo ().
Gursel Koca

@GurselKoca Potrebbe fare esplicitamente member = Foo. <E> createFoo (); richiedendo che corrispondano al tempo di compilazione.
George Xavier

Risposte:


183

Sì, questa è un'inferenza di tipo basata sulla destinazione dell'assegnazione, come da sezione JLS 15.12.2.8 . Per essere espliciti, chiameresti qualcosa come:

Foo.<String>createFoo();

3
Oppure, come nel mio caso: Foo.<E>createFoo();grazie :)
fredoverflow

7
Come mai funziona anche senza incarico? Cioè, l' istruzione si Foo.createFoo(); compila bene ...? Ciò è dovuto alla cancellazione del tipo?
fredoverflow

9
@FredOverflow senza assegnazione Eè "dedotto" comeObject
irreputabile

2
La nuova posizione del collegamento sarebbe probabilmente: docs.oracle.com/javase/specs/jls/se8/html/…
Joanis

3
Un modo diverso per specificare il tipo di Esarebbe definire createFoo()prendere un argomento di tipo Class<E>(così sarebbe createFoo(Class<E> type)) e chiamarlo concreateFoo(String.class)
Gavin S. Yancey
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.