为什么用Java,我可以写
List<?> list = new LinkedList<Double>();
Run Code Online (Sandbox Code Playgroud)
但不是
List<Container<?>> list = new LinkedList<Container<Double>>();
Run Code Online (Sandbox Code Playgroud)
容器就是这样的东西
public class Container<T> { ... }
Run Code Online (Sandbox Code Playgroud)
这是因为我有一个接受a的方法,List<Container<?>>我想使用Arrays.asList将参数传递给它:
process(Arrays.asList(new Container<Double>(), new Container<Double>()));
Run Code Online (Sandbox Code Playgroud)
但是语言不允许这样做,因为它推断出的类型Arrays.asList是List<Container<Double>>,而且不能分配List<Container<?>>.
如果我将一个String参数化的容器添加到调用中,
process(Arrays.asList(new Container<Double>(), new Container<String>()));
Run Code Online (Sandbox Code Playgroud)
它仍然不起作用,因为它推断出List<Container<? extends Serializable & Comparable<?>>>Arrays.asList 的类型.只有当我传入既不可比较也不可序列化的东西时,它才能正常工作.
当然,我可以放一个演员并让编译器关闭,但我想知道我在这里做错了什么.
kdg*_*ory 13
每个参数化必须是通配符:
List<? extends Container<?>> list = new LinkedList<Container<Double>>();
Run Code Online (Sandbox Code Playgroud)
编辑:我正在通过Angelika Langer的常见问题解答进行解释,但没有找到一个(它可能在那里,但隐藏在500页的某个地方).
考虑这一点的方法是每个参数化都是独立的,除非您明确说明,否则编译器不会推断出有关参数化的信息.
| 归档时间: |
|
| 查看次数: |
4165 次 |
| 最近记录: |