java通用模板错误

时间:2011-12-06 22:15:46

标签: java generics

为什么我在界面中使用以下定义得到编译错误:
区域是一个界面。

public interface Shape {
     ...  
     public Comparator<T extends Area> getComparator();
}

而不是如果我改用:

public interface Shape {
     ... 
     public Comparator<? extends Area> getComparator();
}

3 个答案:

答案 0 :(得分:5)

因为编译器不知道T应该是什么或代表什么。现在,如果您使用public interface Shape<T>作为接口声明,我们可能会得到一些可以解决的问题。

答案 1 :(得分:3)

未在您显示的代码示例中定义T.

以下内容应该是合法的:

public interface Shape {
     ...  
     public <T extends Area> Comparator<T> getComparator();
}

或:

public interface Shape<T extends Area> {
     ...  
     public Comparator<T> getComparator();
}

答案 2 :(得分:2)

第一种方法是基于参数返回一个对象,如果它的类扩展了Area类。

第二种方法不必等待参数来获取类型。

要使第一个工作,要么在界面上推断泛型:

public interface Shape<T extends Area>

或参数化方法:

public <T extends Area> Comparator<T> getComparator();

编译器需要知道T可以是什么,并且T基于参数或具有推断泛型的构造中的定义。