Java 泛型、继承和类型擦除问题

Java 泛型、继承和类型擦除问题,java,generics,Java,Generics,我不明白为什么下面包含泛型和通配符的代码段无效 封装测试; 公共类应用程序{ 专用接口条件{ 字符串get(); } 专用接口处理器{ 布尔过程(最终T条件); } 私有静态类持有者类{ 专用最终处理器; 私人最终T条件; 公共持有者类别(最终处理器,最终T条件){ this.processor=处理器; 这个条件=条件; } 公共处理器getProcessor(){ 返回处理器; } 公共T getCondition(){ 返回条件; } } 私有静态类FirstCondition实现条件{

我不明白为什么下面包含泛型和通配符的代码段无效

封装测试;
公共类应用程序{
专用接口条件{
字符串get();
}
专用接口处理器{
布尔过程(最终T条件);
}
私有静态类持有者类{
专用最终处理器;
私人最终T条件;
公共持有者类别(最终处理器,最终T条件){
this.processor=处理器;
这个条件=条件;
}
公共处理器getProcessor(){
返回处理器;
}
公共T getCondition(){
返回条件;
}
}
私有静态类FirstCondition实现条件{
@凌驾
公共字符串get(){
返回“混凝土”;
}
}
私有静态类FirstProcessor实现处理器{
@凌驾
公共布尔进程(FirstCondition){
System.out.println(condition.get());
返回false;
}
}
公共静态void main(字符串[]args){

final HolderClass
?用于声明泛型类的扩展是经典的。您可以使用它来设置泛型类的边界。
但在实例化泛型类型时,通常会指定需要操作的类型,并且不会使用带上界通配符的声明,因为这会设置一些规则,为您提供一些可能性(从子类型变量赋值),但也会提供一些约束

一个有助于您理解的示例:

List<? extends Number> numbers = null;
numbers.add(1); // Doesn't compile for same reason

您能指出代码中的第58行吗?也许我们无论如何都能找出它,但如果您指出错误消息中的那行,我们会更容易。您已声明
holder
具有泛型类型
(未知),因此编译器无法确定
链接到
holder.getCondition()
过程所期望的
T
相同。如果您重写它以删除未知项,则可能可以使其工作。
?扩展条件
表示未知但特定的类型,即
条件
或子类。相关:
List<Number> numbers = null;
numbers.add(1);
List<? extends Number> numbers = null;
List<? extends Float> floats = null;
numbers = floats;  // valid
numbers.add(Long.valueOf(1)); // doesn't compile since no type safe
final HolderClass<FirstCondition> holder = new HolderClass<>(new FirstProcessor(), new FirstCondition());
holder.getProcessor().process(holder.getCondition());