首页 > 解决方案 > 将对象投射到 ? 类型作为 List 的参数

问题描述

为什么Java不能MyObject转换为??这是我得到的错误:

java.util.List<MyMessage<MyObject>> cannot be converted to java.util.List<MyMessage<?>>

当我尝试通过时:

List<MyMessage<MyObject>> x = ...

方法:

void foo (List<MyMessage<?>> x) {
...
}

标签: java

解决方案


假设您的MyMessage班级看起来像:

class MyMessage<T> {
  T object;
}

您目前可以x在方法内部添加内容:

void foo (List<MyMessage<?>> x) {
  MyMessage<String> myMessage = ...;
  x.add(myMessage);
}

如果您被允许通过 a List<MyMessage<MyObject>>,那么您可以这样做:

List<MyMessage<MyObject>> list = new ArrayList<>();
foo(list);  // Pretend this isn't a compiler error.
MyObject message = list.get(0).object;

现在你会得到 a ClassCastException,因为list.get(0).object是 a String,而不是 a MyObject

“但是我的课程看起来不像那样”,您可能会说:编译器不知道没有可以返回 a 的字段或提供程序方法T(或涉及T; 所以它会谨慎行事,并阻止您从做它。

为了避免这个问题,让它不能添加到列表中foo

void foo (List<? extends MyMessage<?>> x) {
  MyMessage<String> myMessage = ...;
  // x.add(myMessage);  // Would be a compiler error!
}

推荐阅读