Tôi đã sau phương pháp dường như tương tự, do1
và do2
:tại sao java suy luận không
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);
}
}
Khi tôi biên dịch mã ở trên (javac 1.8.0_92), gọi do2(leA)
công trình trong khi do1(leA)
thất bại.
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
Bây giờ tôi đang tự hỏi: là này do thực hiện không đầy đủ các loại suy luận trong javac, hoặc tôi đang tạo ra một loại cây không hợp lệ với lời khẩn cầu do1(leA)
?
Bởi vì theo tôi biết:
- trong
do1(leA)
:Capture(? extends A)
trở thành một siêu kiểu của C - trong
do2(leA)
:Capture(? extends A)
trở thành một siêu kiểu của C (gián tiếp thông qua:Capture(? extends A) == D
vàD :> C
ý nghĩa trong cả hai trường hợp C
nên (không có lỗi) giải quyết thành "? extends A"
Tôi có thể tạo lại điều đó với JDK 1.8.0_51. FYI, Eclipse Mars.2 biên dịch nó tốt ... – Tunaki
Biên dịch OK cho tôi cũng sử dụng '1.8.0_91-b14'. IIRC, cập nhật 40 là lỗi - đây có thể là một trong những lỗi. Có thể chỉ cần cập nhật phiên bản java của bạn. – Bohemian
cảm ơn cho lên, tôi cập nhật lên 1.8.0_92, vẫn nhận được cùng một lỗi biên dịch: http://pastebin.com/tEUfX2JC –