2010-11-04 15 views
13

Ich fand, dass Sie eine generische Methode mit einem speziellen Typ aufrufen können, zB:Wie kann ich eine generische Methode mit einem Typ aufrufen, wenn dieser statisch importiert wird?

nehmen wir eine generische Methode haben:

class ListUtils { 
    public static <T> List<T> createList() { 
     return new ArrayList<T>(); 
    } 
} 

wir es mögen anrufen:

List<Integer> intList = ListUtils.<Integer>createList(); 

Aber Wie können wir es nennen, wenn es statisch importiert wird? Beispiel:

List<Integer> intList = <Integer>createList(); 

das funktioniert nicht.

+0

Gibt es keine Inferenz für Ihr konkretes Beispiel? – Roman

+0

mögliches Duplikat von [Statisch importierte Methode mit expliziten Typparametern aufrufen] (http://stackoverflow.com/questions/2050317/invokingstaticallyimportedmethod-with-explicit-type-parameters) –

+0

Mögliches Duplikat von [Statisch aufrufen importierte Methode mit expliziten Typparametern] (https://stackoverflow.com/questions/2050317/invokingstaticly-importedmethod-with-explicit-type-parameters) –

Antwort

9

Sie können nicht. Sie müssten mit dem Klassennamen darauf verweisen.

Es scheint, dass mit:

void foo(List<String> a) {} 

und foo(createList()) ruft nicht den richtigen Typ nicht schließen. So sollten Sie entweder explizit die Klassennamen verwenden, wie ListUtils.createList() oder verwenden Sie eine Zwischengröße:

List<String> fooList = createList(); 
foo(fooList); 

Schließlich guava hat Lists.newArrayList(), so dass Sie besser, dass die Wiederverwendung würden.

+0

Danke! Ich habe nicht einmal über diese Situation nachgedacht (Aufruf an der Parameterstelle). Und ich habe mich nur über Guava gelehnt, es ist großartig! –

2

Die folgenden Werke für mich:

package test; 
import java.util.List; 
import static test.ListUtils.createList; 

public class ListConsumer { 
    public static void main(String[] args) { 
     List<Integer> list = createList(); 
     List<String> list2 = createList(); 
    } 
} 
+0

Danke für die Klarstellung :) Ich habe dann Artschluss nicht ganz verstanden. –

1

Ich glaube Mindas hat bereits bewiesen, dass dies mit Inferenz funktionieren sollte, ist die Syntax nur ein bisschen ab. Allerdings würde ich Ihnen empfehlen, sich Google Guava anzusehen, sie haben genau diese Methode und einige andere nützliche zur Verfügung. Kein Sinn, das Rad neu zu erfinden :)

2

Sie können nicht. Dies ist ein Konstruktionsfehler in der Syntax der Java-Sprache. Scala, eine neuere statisch typisierte Sprache auf JVM, behebt dies. (So ​​würden Sie diesen Anruf in Scala machen: val intList: List[Int] = creatList[Int]()).

0

Soweit ich gelesen habe, ist ein Nachteil des statischen Importmechanismus, dass Sie das aufrufende Objekt/die Klasse angeben müssen, wenn Sie formale Parameter bereitstellen möchten. Mindas ist korrekt, wenn keine Argumente vorhanden sind, verwendet der Inferenzmechanismus den Typ, dem der Rückgabewert der Funktion zugewiesen ist. Der Trick kommt jedoch, wenn Sie Argumente liefern. Wenn Sie möchten, um zu vermeiden, den anrufenden Objekt/Klasse geben Sie Hinweis durch eine Besetzung der Argumente als solche geben kann:

public static <E> E foo(E e) {} 

Number n = foo((Number)3); 

Mit dem Typ Hinweis, kehrt der Typinferenz ein Objekt vom Typ Zahl, statt von Integer, wie es anders gedacht hätte.

Verwandte Themen