gpt4 book ai didi

java - Java 中的泛型和通配符使用静态函数 - "not applicable for the arguments"错误

转载 作者:行者123 更新时间:2023-11-29 03:43:34 24 4
gpt4 key购买 nike

我无法弄清楚以下代码有什么问题,具体来说,为什么不是 <A extends ClassA>相当于<? extends ClassA> .

不应该bar()可以调用foo()

编译器说方法 foo(...) 不适用于参数 (...)
(确切的错误在下面的评论中指定)

static class ClassA {};
static class ClassB<A extends ClassA> {};

private static <A extends ClassA> Collection<ClassB<A>> foo(Collection<ClassB<A>> as) {
return as;
}

private Collection<ClassB<? extends ClassA>> bar(Collection<ClassB<? extends ClassA>> as) {
// Error:
// The method foo(Collection<ClassB<A>>) is not applicable
// for the arguments (Collection<ClassB<? extends ClassA>>)
return foo(as);
}

谢谢!

最佳答案

问题是您正在尝试传递 Collection<ClassB<? extends ClassA>> 类型的内容变成某种类型的东西 Collection<ClassB<A>> .它们不兼容。

为了使两个泛型类型兼容,它们的类型参数(如果两者都不是通配符)必须完全匹配。这里,类型参数是ClassB<? extends ClassA>ClassB<A> (对于某些 A );两者都不是通配符,而且它们永远不可能完全相同——无论如何A也就是说,它代表一种特定的类型。确实ClassB<A> (无论 A 是什么)将是 ClassB<? extends ClassA>子类型 ;但这无关紧要——就像String一样是 Object 的子类型但是Collection<String>Collection<Object>不兼容。

如果你制作foo()稍微更通用一些,这样通用参数就在顶层:

private static <T extends ClassB<? extends ClassA>> Collection<T> foo(Collection<T> as) {
return as;
}

然后您可以使用捕获来执行此操作:

private Collection<? extends ClassB<? extends ClassA>> bar(Collection<? extends ClassB<? extends ClassA>> as) {
return foo(as);
}

关于java - Java 中的泛型和通配符使用静态函数 - "not applicable for the arguments"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12077313/

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