java - 将对象投射到 ? 类型作为 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) {
...
}
解决方案
假设您的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!
}
推荐阅读
- sql - 聚合值的 SQL 代码是什么?
- image-processing - 为什么 caffe io load_image 将 png 文件的 rgb 值从 0-1 标准化?
- ios - 将手指拖离它时取消选择 UIView“按钮”
- dockerfile - 使用 docker 文件中的环境变量复制文件,然后执行入口点
- yii2 - 相同的路由根据 HTTP 动词做出不同的响应
- firebase - 如何引用一个孩子的孩子
- asp.net - 使用 ASP.NET Membership 将 2FA 添加到 .NET Web 应用程序
- json - 如何在java中将下面的字符串转换为正确的json格式?
- xpath - 如何选择升序不是某个标签的元素?
- aem - 如何在 AEM 搜索查询生成器中包含标签名称,同时标签 ID 保存在存储库中