2014-10-31 2 views
5

У меня есть следующий интерфейс:Infer дженерики с интерфейсом - Java

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

и класс, реализующий этот интерфейс:

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

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

}

поэтому использование выше будет:

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

Is th как сделать интерфейс Evaluator неявным образом возвращать общий тип, определенный в классе, реализующем его? так что использование было бы просто:

Evaluator eval = new PrecisionEvaluator(); 

Или есть более чистый способ для этого?

+0

Я думаю, что реальная проблема, с которой вы сталкиваетесь, заключается в том, что вы не дали «Карта <Тройка <Короткий, Целое, Строка>, АтрибутПрекцияBean>' это собственное имя и, следовательно, собственный класс. – SpaceTrucker

ответ

0

Насколько мне известно, объект типа Evaluator будет сырым, если вы не укажете общий тип. Что вы можете сделать, так как Java 7 является определением типа для создания родового экземпляра (хотя это, вероятно, не поможет в данном случае):

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

Да, есть способ сделать это: узнать Scala, его синтаксис намного проще, чем Java, благодаря, помимо прочего, выводу типа компилятора.

Более серьезно, вы не можете сделать лучше с Java, если вы используете только Evaluator, он будет скомпилирован как Evaluator<Object>, что не позволит вам иметь безопасность и полиморфизм типов. Все, что вы можете сделать здесь, это создать класс class CustomTriple extends Triple<Short,Integer,String>>, чтобы иметь что-то более короткое.

Смежные вопросы