Java 为什么类级别不允许泛型中的super关键字

Java 为什么类级别不允许泛型中的super关键字,java,generics,inheritance,polymorphism,Java,Generics,Inheritance,Polymorphism,仿制药 允许使用A类 但是 不允许使用A类 我不明白这一点。这听起来像是一个新手问题,但我被困在里面了引用: 类定义中不允许使用超界限 //this code does not compile ! class Forbidden<X super Vehicle> { } //此代码不可编译! 类禁止{} 为什么??因为这样的结构没有意义。例如,您无法使用Vehicle删除类型参数,因为可以使用Object实例化禁止的类。因此,无论如何,您都必须删除对象的类型参数。若考虑禁止类,它

仿制药

允许使用A类

但是

不允许使用A类

我不明白这一点。这听起来像是一个新手问题,但我被困在里面了

引用:

类定义中不允许使用超界限

//this code does not compile !
class Forbidden<X super Vehicle> { }
//此代码不可编译!
类禁止{}
为什么??因为这样的结构没有意义。例如,您无法使用Vehicle删除类型参数,因为可以使用Object实例化禁止的类。因此,无论如何,您都必须删除对象的类型参数。若考虑禁止类,它可以取任何值代替X,而不仅仅是车辆的超类。使用超级绑定没有任何意义,它不会给我们带来任何好处。因此,这是不允许的


以这个例子为例:

案例1上限:

public class Node<T extends Comparable<T>> {
    private T data;
    private Node<T> next; 
}
正如我们所知,父类引用可以用来引用子类对象。因此该代码无论如何都是可以接受的,因为引用
数据
可以指向
可比
或其子类的实例

案例2下限:

public class Node<T extends Comparable<T>> {
    private T data;
    private Node<T> next; 
}
如果我们能有这样的代码

public class Node<T super Comparable<T>> {
    private T data;
    private Node<T> next; 
}
公共类节点{
私有T数据;
私有节点下一步;
}

在这种情况下,编译器既不能使用
对象
或任何其他类来替换此处的绑定类型
T
,也不可能使用子类引用来引用父类实例。

这将澄清:-@akhil通配符
在类级别不允许“如果我错了请纠正我”:。因此,在将数据放入结构时,使用
super
<代码>扩展在取出时使用。通配符?在Java中,是一个特殊的实际参数,用于实例化泛型(参数化)类型。它可以用于实例化,而不是在通用单元的定义中。Angelika Langer在常见问题解答中明确回答了这一点:。(长话短说:这没有意义……)我知道我对此发表评论已经晚了。请澄清我的这个查询:“你不能用Vehicle删除type参数,因为禁止的类可以用Object实例化”如果是“list,那么这不是真的吗?使用超绑定非常有意义,而且你给出的引用非常误导。我有一个扩展了
HashMap
MyClass扩展了HashMap
)。如果这里允许使用
super
,我可以保证
MyClass
可以使用
KeyType
键存储项目,因为底层HashMap的键将始终是
KeyType
的super。这里的想法不是将
X
删除到
Vehicle
,这就是
扩展的目的。我们想要
>X
被擦除为高于(或等于)的值要
车辆
,以便类中
X
类型的
列表
可以存储我们想要放入其中的任何X。@Kröw你能举一个例子说明你可以如何处理
K
的一个实例,因为知道它是
键类型
的某个超类型吗?@AnkushGatfane它被删除为
对象
。不同之处在于在
@之间的ce和Y Turner你说的是
K
类型的对象吗,其中
K
KeyType
的超类型?我想我可以调用
对象中声明的任何方法,因为我知道它必须是
对象ce,没有铸造。另外,在我第一次评论的最后一句话中,我的意思是,“……在我们的类中可以存储我们想要放入的任何
车辆”
。”如果这造成任何混乱,请道歉。