看看这三个类。Minatchi 允许对其自身进行扩展,以便其方法的返回类型也可以扩展。为了说明,我使用了静态方法。
public class Minatchi<T extends Minatchi<?>>{
static public <T extends Minatchi<?>>
List<T> listAll(){
return
(List<T>) query();
}
}
所以我将 Minatchi 子类化为 Lady
public class Lady
extends Minatchi<Lady>{
}
这就是可疑行为发生的地方。
public class HelloMinatchi{
private void listA(){
List<Lady> uvs = Lady.listAll();
for (Lady uv: uvs){
logger.info(uv.getName() );
}
}
private void listB(){
for (Lady uv: Lady.listAll()){
logger.info(uv.getName() );
}
}
}
方法 listA 和 listB 本质上是相同的。listA 将列表放入中间变量 uvs 中,而 listB 直接将 listAll 放入 for 循环头中。
但是,对于 listB,编译器会抱怨无法将 Minatchi<?> 转换为 Lady。
所以这个问题是关于Java泛型的设计完整性。另一个仿制药抱怨。
这是 Java 泛型设计者不知道如何解决的故意设计特性还是无意的设计错误。如果是故意的,他们为什么要这样做?如果出现错误,他们是否打算解决它?
或者这是我个人的问题,我不知道声明泛型的更好方法?如果是这样,请告诉我如何。
(我使用了一个通用的 Minatchi 类,因为我也有非静态方法可以暴露给类扩展,我在问题中省略了。)