2014-10-31 19 views
5

tôi có giao diện như sau:Generics Suy luận với giao diện - java

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

Và một lớp thực hiện giao diện:

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

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

}

nên sử dụng những điều trên sẽ là:

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

Thứ ere là một cách để làm cho Evaluator giao diện ngầm hoàn trả kiểu generic được định nghĩa trong lớp thực hiện nó? để việc sử dụng đơn giản là:

Evaluator eval = new PrecisionEvaluator(); 

Hoặc có cách nào khác để tìm hiểu?

+0

Tôi nghĩ rằng vấn đề thực sự bạn đang gặp phải là bạn không đưa ra 'Bản đồ , AttributePrecisionBean>' đó là tên riêng và do đó là lớp riêng của nó. – SpaceTrucker

Trả lời

0

Theo hiểu biết của tôi, đối tượng thuộc loại Evaluator sẽ là loại thô, trừ khi bạn chỉ định loại chung. Những gì bạn có thể làm từ Java 7 là những suy luận kiểu để tạo dụ generic (mặc dù nó có lẽ sẽ không giúp đỡ trong trường hợp này):

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

Vâng có một cách để làm điều đó: tìm hiểu Scala, cú pháp của nó là đơn giản hơn nhiều so với Java, nhờ vào các lý do khác, suy luận kiểu trình biên dịch.

Quan trọng hơn, bạn không thể làm tốt hơn với Java, nếu bạn chỉ sử dụng Evaluator, nó sẽ được biên dịch thành Evaluator<Object>, điều này sẽ không cho phép bạn có tính an toàn và đa hình. Tất cả những gì bạn có thể làm ở đây là tạo ra một lớp class CustomTriple extends Triple<Short,Integer,String>> để có cái gì đó ngắn hơn.

Các vấn đề liên quan