2016-05-06 36 views
6

Tôi đã sau phương pháp dường như tương tự, do1do2: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) == DD :> 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"

+4

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

+1

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

+1

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 –

Trả lời

-2

Bạn cần extends C không super C:

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

Một super của C là và tổ tiên, không phải là một lớp con.

+0

Tôi cũng đã khám phá tùy chọn đó và tùy chọn sẽ biên dịch (điều đó sẽ làm cho loại cây trong do1 khác với do2). Nhưng tôi quan tâm lý do tại sao các phương pháp với các loại cây tương tự dường như không biên dịch thành công .. –

Các vấn đề liên quan