2014-10-31 12 views
5

Mam następujący interfejs:wywnioskować rodzajowych z interfejsem - java

public interface Evaluator<T> { 
    T evaluate(Collection<Extractable> sample); 
} 

a klasa implementująca ten interfejs:

public class PrecisionEvaluator implements Evaluator<Map<Triple<Short, Integer, String>, AttributePrecisionBean>> { 

@Override 
public Map<Triple<Short, Integer, String>, AttributePrecisionBean> evaluate(Collection<Extractable> sample){ 
    ... 

}

więc korzystanie z powyższym byłoby:

Evaluator<Map<Triple<Short, Integer, String>, AttributePrecisionBean>> eval = new PrecisionEvaluator(); 

Czy Czy istnieje sposób, aby interfejs Evaluator domyślnie zwrócił ogólny typ zdefiniowany w klasie implementującej go? tak, że użycie byłoby po prostu następujące:

Evaluator eval = new PrecisionEvaluator(); 

Czy istnieje lepszy sposób, aby o tym zadbać?

+0

Myślę, że prawdziwy problem, który masz, to to, że nie dałeś "Map , AttributePrecisionBean>' to własna nazwa, a zatem jej własna klasa. – SpaceTrucker

Odpowiedz

0

Zgodnie z moją wiedzą obiekt typu Evaluator będzie typu surowego, chyba że zostanie określony typ ogólny. Co można zrobić, ponieważ Java 7 jest wnioskowanie typu rodzajowego do utworzenia instancji (choć prawdopodobnie nie pomoże w tym przypadku):

Evaluator<Map<Triple<Short, Integer, String>, AttributePrecisionBean>> eval 
    = new Evaluator<>(); 
0

Tak istnieje sposób, aby to zrobić: dowiedzieć się Scala, jego składnia jest znacznie prostsze niż Java, między innymi dzięki wnioskowaniu typu kompilatora.

Co ważniejsze, nie można zrobić lepiej z Javą, jeśli użyjesz tylko Evaluator, zostanie ono skompilowane jako Evaluator<Object>, co nie pozwoli ci na bezpieczeństwo i polimorfizm typu. Wszystko, co możesz zrobić, to stworzyć klasę class CustomTriple extends Triple<Short,Integer,String>>, aby mieć coś krótszego.

Powiązane problemy