java - 嵌套类型的通配符
问题描述
我试图理解为什么这种方法的类型擦除不适用于通配符。
public boolean foo(TypeA<TypeB<?>, TypeB<?>> bar) {
return true;
}
// instantiate an object
TypeA<TypeB<TypeC>, TypeB<TypeC>> somethingOtherThanFooBar = ...;
// TypeA<TypeB<?>, TypeB<?>> cannot be applied to TypeA<TypeB<TypeC>, TypeB<TypeC>>
foo(somethingOtherThanFooBar);
我知道如果方法签名是它会起作用,pulic <T, U> boolean foo(TypeA<TypeB<T>, TypeB<U>> bar)
但这不适用于通配符,原因是我无法理解。
解决方案
规则是:A
is-aB
暗示G<A>
is-aG<? extends B>
和G<B>
is-a G<? super A>
。
所以
TypeC
is-aObject
,因此TypeB<TypeC>
is-aTypeB<?>
,因此TypeA<TypeB<TypeC>>
是一个TypeA<? extends TypeB<?>>
。
没有类型规则允许您从参数类型获取参数类型。
你应该看看 Scala,它允许你声明泛型类型参数的变化;如果编译器可以知道您的泛型类将始终使用协变位置的参数,它可以允许您想要的转换。
推荐阅读
- ms-access - 如何在不同的子表单中搜索单词
- python - 使用 yolo 暗网分类的问题
- ssl-certificate - Yeoman Excel 插件 - 证书问题
- python-3.x - 如何从满足特定条件的数据框中获取行
- django - 从views.py认证后重定向到特定页面
- javascript - 使用 Jest 进行 neo4j Node js 单元测试
- java - 如何正确管理对数据库对象的访问?
- python - 如何使用继承的多处理?
- visual-studio - 从 Visual Studio 构建 NuGet 包
- python-3.x - 服务层的Python烧瓶目录结构?