Java 界失配泛型

Java 界失配泛型,java,generics,Java,Generics,我有低于阶级的等级制度 头等舱 class First<T> { } class Second<T> extends First<T> { } class Third<T extends First<T>> { } 第一类{ } 二等舱 class First<T> { } class Second<T> extends First<T> { } class Third<T ex

我有低于阶级的等级制度

头等舱

class First<T> {
}
class Second<T> extends First<T> {

}
class Third<T extends First<T>> {
}
第一类{
}
二等舱

class First<T> {
}
class Second<T> extends First<T> {

}
class Third<T extends First<T>> {
}
第二类扩展第一类{
}
三等舱

class First<T> {
}
class Second<T> extends First<T> {

}
class Third<T extends First<T>> {
}
第三类{
}
错误行:

Third<Second<String>> name = new Third<Second<String>>();//Compilation error
Third name=new Third()//编译错误
绑定不匹配:第二种类型不是
第三种类型的有界参数

我真的对上述错误感到困惑。你能解释一下为什么会发生这种编译错误吗

T首先扩展
第二个
不同,因为T既绑定到
字符串
,又绑定到扩展
第一个
的东西

我有一种感觉,你想在第三种情况下使用不同的参数,比如

class Third<T extends First<?>> {
}

class Third你作业中的混淆是
T
Second
中是
String
,而
Third
中的
T
Second
。因此,为了使赋值有效,
Second
应该扩展
First
。但情况并非如此,因为
第二个
扩展了
第一个
。以下代码按预期编译:

public class Test {

   static class First<T> {
   }

   static class Second<T> extends First<Second<T>> {
   }

   static class Third<T extends First<T>> {
   }

   public static void main(String... args) {
      Third<Second<String>> name = new Third<Second<String>>();
   }
}
公共类测试{
静态类优先{
}
第二个静态类首先扩展{
}
静态三级{
}
公共静态void main(字符串…参数){
第三个名称=新的第三个();
}
}

Augusto的方法是正确的,但是为了避免使用通配符
您可以在类
第三个
中添加另一个类型参数:

class Third<U, T extends First<U>> {
    // ...
}

Third<String, Second<String>> name = new Third<>();
第三类{
// ...
}
第三个名称=新的第三个();

缺点是您必须在类型参数中两次提到
String

您还可以执行
Third
classthird{}
给出编译错误。