为什么我在界面中使用以下定义得到编译错误:
区域是一个界面。
public interface Shape {
...
public Comparator<T extends Area> getComparator();
}
而不是如果我改用:
public interface Shape {
...
public Comparator<? extends Area> getComparator();
}
答案 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基于参数或具有推断泛型的构造中的定义。