Java 如果我实现List并在接受List<;的方法中调用add,会怎么样;?扩展超类型>;

Java 如果我实现List并在接受List<;的方法中调用add,会怎么样;?扩展超类型>;,java,generics,Java,Generics,我已经读到以下代码片段将导致 void tryAddingToList(List您应该将子类型显式转换为超类型。因为并非所有超类型的对象都是子类型(可能是其他子类)。可能会给您一些提示。祝您好运。是的,确实是编译器应用了限制。大部分信息(并非全部)在实际编译为字节码时将被删除。您应该将泛型解释为开发人员的额外信息,这样我们就不会犯愚蠢的错误。您应该使用super而不是extends void tryAddingToList(List<? super SubType> list) {

我已经读到以下代码片段将导致


void tryAddingToList(List您应该将
子类型
显式转换为
超类型
。因为并非所有
超类型
的对象都是
子类型
(可能是其他子类)。可能会给您一些提示。祝您好运。

是的,确实是编译器应用了限制。大部分信息(并非全部)在实际编译为字节码时将被删除。您应该将泛型解释为开发人员的额外信息,这样我们就不会犯愚蠢的错误。

您应该使用
super
而不是
extends

void tryAddingToList(List<? super SubType> list) {
    list.add(new SubType());
}

void tryAddingToList(ListThank!但我的问题不是如何使代码段工作。这不是问题所在。这也是错误的,因为
子类型
总是可以隐式转换为
超类型
:编译错误是因为编译器不知道泛型类型所指的具体子类。这也是一种常见的方法将某些集合“声明”为只读。如果看到类似
List@Jagat不客气。很抱歉,我帮不了你更多。@Cameron谢谢你指出隐含的排除,那么
void tryAddingToList之间有什么区别吗(List@Summer_More_More_Tea没有区别。在您的示例中,T仅用于捕获实际类型,以便您可以在方法中重用实际类型。例如,为了某种目的创建一个列表。抱歉,但这并没有回答我的问题,这是关于如何强制执行
?extends
设置的限制。编译器将不允许添加到具有有界通配符的列表中。这是一条规则。至于第二个问题,您自己的列表实现是否将参数化?
void tryAddingToList(List<? super SubType> list) {
    list.add(new SubType());
}