Aufrufen statischer generischer Methoden

105

Ich bin auf eine merkwürdige Situation mit statischen generischen Methoden gestoßen. Dies ist der Code:

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

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

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

Wie kommt es, dass ich im Ausdruck keine Typargumente angeben muss Foo.createFoo()? Ist das eine Art Typinferenz? Wie kann ich das Typargument angeben, wenn ich explizit darauf eingehen möchte?

Fredoverflow
quelle
7
Ich würde Ihnen empfehlen, den Typparameter E der createFoo-Methode zu ändern. Da sich der Typparameter E der Klasse Foo vom Typparameter E der Methode createFoo () unterscheidet.
Gursel Koca
@ GurselKoca Er könnte explizit member = Foo tun. <E> createFoo (); Sie müssen mit der Kompilierungszeit identisch sein.
George Xavier

Antworten:

183

Ja, dies ist eine Typinferenz basierend auf dem Ziel der Zuweisung gemäß JLS-Abschnitt 15.12.2.8 . Um explizit zu sein, würden Sie so etwas nennen wie:

Foo.<String>createFoo();
Jon Skeet
quelle
3
Oder, wie in meinem Fall: Foo.<E>createFoo();Danke :)
Fredoverflow
7
Wie kommt es, dass dies auch ohne Zuordnung funktioniert? Das heißt, die Anweisung wird gut Foo.createFoo(); kompiliert ...? Liegt das an der Typlöschung?
Fredoverflow
9
@FredOverflow ohne Zuordnung Ewird "abgeleitet", umObject
unwiderlegbar
2
Neuer Link-Speicherort wäre wahrscheinlich: docs.oracle.com/javase/specs/jls/se8/html/…
Joanis
3
Eine andere Möglichkeit, den Typ von anzugeben E, besteht darin createFoo(), ein Argument vom Typ zu definieren Class<E>(so wie es wäre createFoo(Class<E> type)) und es mitcreateFoo(String.class)
Gavin S. Yancey am