我无法理解这里的错误
import java.util.*;
class Main {
private static class SomeX {}
void doSomethingWithX(SomeX someX) {
Collection<? extends SomeX> colectionOfX = new ArrayList<>();
colectionOfX.add(someX);
}
}
javac
说:
Main.java:8: error: method add in interface Collection<E> cannot be applied to given types; colectionOfX.add(someX); ^ required: CAP#1 found: SomeX reason: argument mismatch; SomeX cannot be converted to CAP#1 where E is a type-variable: E extends Object declared in interface Collection where CAP#1 is a fresh type-variable: CAP#1 extends SomeX from capture of ? extends SomeX
根据我的理解extends
将CAP#1的下限限制为SomeX
,SomeX
本身应满足限制。
怎么了? (用javac 1.8.0_102
编译)
答案 0 :(得分:1)
如果您想允许colectionOfX
包含SomeX
的任何实例,则应将其声明为:
Collection<SomeX> colectionOfX = new ArrayList<>();
当您将其声明为
时Collection<? extends SomeX> colectionOfX = ...;
这意味着您可以为其分配任何Collection
,其中包含SomeX
某种类型的元素或SomeX
的子类。
例如,您可以为其分配List<SomeBX>
,其中SomeBX
扩展SomeX
。在这种情况下,只能将SomeBX
的实例添加到集合中。
因此,如果您尝试向集合添加SomeX
不是SomeBX
的实例(例如,SomeAX
的实例,它也是{{1}的子类}),它将是无效的。
答案 1 :(得分:0)
所以,这个问题实际上已在“How can I add to List<? extends Number> data structures?”中得到解答,但谷歌搜索却没有带来那场比赛。
就我所知,简短的答案如下:
<? extends SomeX>
因为import React from 'react';
import { createHistory } from 'history';
import { Router, Route, IndexRoute, Redirect, useRouterHistory } from 'react-router';
import MainLayout from './../views/layout/mainLayout.jsx';
import Home from './../views/home.jsx';
import About from './../views/about.jsx';
import Error404 from './../views/404.jsx';
const browserHistory = useRouterHistory(createHistory)({
basename: '/example-url'
});
module.exports = (
<Router history={browserHistory}>
<Route path='/' component={MainLayout}>
<IndexRoute component={Home} />
<Route path='about/' component={About} />
<Route path='*' component={Error404} />
</Route>
</Router>
是Collection类型的下限限制而不是项类型 - 可以分配具有更高有限值的集合实例,并且考虑到这一点,将SomeX放入此类集合中从编译器的角度来看,这不是类型安全的。