У меня есть следующий, казалось бы, подобные методы, 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"
Я могу воспроизвести это с помощью JDK 1.8.0_51. FYI, Eclipse Mars.2 компилирует его отлично ... – Tunaki
Скомпилирует OK для меня тоже с помощью '1.8.0_91-b14'. IIRC, обновление 40 было ошибкой - это могло быть одной из ошибок. Возможно, просто обновите свою версию Java. – Bohemian
спасибо за вверх, я обновил до 1.8.0_92, все равно получаю ту же ошибку компиляции: http://pastebin.com/tEUfX2JC –