将泛型与通配符一起使用不允许使用以泛型作为参数的方法
如果我将泛型类声明为类似于
public class Driver<V extends Car>
Car 是接口的类。
然后,我将它与这样的东西一起使用:
Driver<?> driver = new Driver<Chevrolet>();
我不想将 car 的特定实现指定为通用。
为什么我无法调用驱动程序中以泛型类作为参数实现的方法?
例如,如果 Driver 有一个类似
public void drive(V vehicle)
It 的方法,则不允许我使用我的驱动程序实例调用该方法 (Driver
)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
因为编译器不知道
driver.drive(?vehicle)
将接受什么类型的参数。应该选择雪佛兰、本田还是其他类型的车?有关更多详细信息,您可能会发现Gilad Bracha 的泛型教程很有帮助。
你的drive()方法的目的是什么?
vehicle
参数是否需要输入 Car 的特定子类型?简单地接受汽车
会更合适吗?以下是我原来答案的一部分,但评论中的讨论证明这是不正确的。我把它留在这里,这样评论就不会被孤立。
尝试像这样声明你的方法:
看看它是否更适合你。
Because the compiler doesn't know what type of argument
driver.drive(? vehicle)
will accept. Should it take a Chevrolet, a Honda, or some other type?For more details you might find Gilad Bracha's Generics Tutorial helpful.
What is the purpose of your drive() method. Does the
vehicle
parameter need to be typed to the specific subtype of Car? Would it be more appropriate for it to simply accept aCar
?The following was part of my original answer, but discussion in the comments proved that it was incorrect. I'm leaving it here so the comments aren't orphaned.
Try declaring your method like this:
and see if that works better for you.
这个问题很模糊,但我相信 Angelika Langer 的 Java 泛型常见问题解答的摘录可以回答这个问题:
本质上
?
对于泛型类型系统的信息较少,因此为了强制执行类型安全,必须拒绝某些调用,因为它们不是类型安全的。Box
可以是Box
、Box
,甚至是Box>
。因此给出一个Box; box
、box.put("xyz")
必须被拒绝。参考文献
相关问题
List
数据结构?The question is vague, but I believe this excerpt from Angelika Langer's Java Generics FAQ answers it:
Essentially
?
has less information for the generic type system, and thus to enforce typesafety certain invokations must be rejected, because they're not typesafe.A
Box<?>
may be aBox<Integer>
, aBox<String>
, or even aBox<Box<?>>
. Thus given aBox<?> box
,box.put("xyz")
must be rejected.References
Related questions
List<? extends Number>
data structures?