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?


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();

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.