2016-05-06 5 views
6

У меня есть следующий, казалось бы, подобные методы, do1 и do2:почему ява умозаключение неудачи

class Demo<A>{ 
    public <C> Iterable<C> do1(List<? super C> _a) { 
     return null; 
    } 


    public <C extends D, D> Iterable<C> do2(List<D> _a) { 
     return null; 
    } 

    { 
     List<? extends A> leA = null; 

     do2(leA); 
     do1(leA); 
    } 
} 

Когда я компилирую выше коды (JAVAC 1.8.0_92), вызывая do2(leA) работы в то время как do1(leA) терпит неудачу.

required: List<? super C> 
found: List<CAP#1> 
reason: cannot infer type-variable(s) C 
(argument mismatch; List<CAP#1> cannot be converted to List<? super C>) 
where C,A are type-variables: 
    C extends Object declared in method <C>do1(List<? super C>) 
    A extends Object declared in class Cache 
where CAP#1 is a fresh type-variable: 
    CAP#1 extends A from capture of ? extends A 

Теперь я задаюсь вопросом: является ли это из-за неполного осуществления умозаключения типа в JAVAC, или я создаю неверный тип-дерево с вызовом do1(leA)?

Потому что, насколько мне известно:

  • в do1(leA): Capture(? extends A) становится надтипа C
  • в do2(leA): Capture(? extends A) становится супертипом C (косвенно через: Capture(? extends A) == D и D :> C

значение в обеих ситуациях C должен (без ошибок) решить на "? extends A"

+4

Я могу воспроизвести это с помощью JDK 1.8.0_51. FYI, Eclipse Mars.2 компилирует его отлично ... – Tunaki

+1

Скомпилирует OK для меня тоже с помощью '1.8.0_91-b14'. IIRC, обновление 40 было ошибкой - это могло быть одной из ошибок. Возможно, просто обновите свою версию Java. – Bohemian

+1

спасибо за вверх, я обновил до 1.8.0_92, все равно получаю ту же ошибку компиляции: http://pastebin.com/tEUfX2JC –

ответ

-2

Вам нужно extends C не super C:

public <C> Iterable<C> do1(List<? extends C> _a) { 

super из C является и предком, не подкласс.

+0

Я также изучил эту опцию, которая будет скомпилирована (что сделает дерево типов в do1 отличным от do2). Но мне интересно, почему методы с похожими типами деревьев не скомпилируются успешно. –

Смежные вопросы