不兼容的类型:SomeX无法转换为CAP#1

时间:2016-09-25 08:48:51

标签: java generics

我无法理解这里的错误

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的下限限制为SomeXSomeX本身应满足限制。

怎么了? (用javac 1.8.0_102编译)

2 个答案:

答案 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放入此类集合中从编译器的角度来看,这不是类型安全的。