gpt4 book ai didi

java - 为什么在泛型中需要 "? extends"

转载 作者:行者123 更新时间:2023-11-29 04:02:42 25 4
gpt4 key购买 nike

有没有人能很好地解释为什么 ?必须在泛型中使用 extends 语法?我知道语法强制执行的是什么,但它似乎与 Java 中的非泛型类型检查方式不一致。例如:

void someMethod() {
List<String> strings = new ArrayList<String>();
doSomethingWithStrings(strings);
doSomethingWithObjects(strings); // << This doesn't compile
}

void doSomethingWithStrings(Collection<String> strings) {}

void doSomethingWithObjects(Collection<Object> objects) {}

在注释的地方会有编译错误,而在下一个例子中显然没有编译错误:

void someOtherMethod() {
String string = "worksInBothPlaces";
doSomethingWithAString(string);
doSomethingWithAObject(string);
}

void doSomethingWithAString(String string) {}

void doSomethingWithAObject(Object object) {}

我知道可以通过将第二个签名更改为来修复第一个 block

void doSomethingWithObjects(Collection<? extends Object> objects) {}

但是这似乎与其他地方进行的类型检查不一致。是否有一些没有 的明确示例? extends 某些泛型类会更难甚至不可能编写。

最佳答案

基本上泛型无法确认重新分配的东西。

void AddSomething(Collection<Stuff> object)
{
object.Add(new Stuff());
}

调用失败

AddSomething(new Collection<ChildStuff>())

因为您不能将 Stuff 添加到 ChildStuff 集合中。

为了让编译器/运行时/任何知道你的函数不会做那样的事情,需要告诉它可以接受子类型,这是通过 ?扩展语法。

关于java - 为什么在泛型中需要 "? extends",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2383279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com