2016-05-06 46 views
6

Mam następujący pozornie podobnych metod, do1 i do2:dlaczego java wnioskowanie nie

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); 
    } 
} 

Kiedy skompilować powyższy kod (javac 1.8.0_92), nazywając do2(leA) prace podczas do1(leA) zawiedzie.

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 

Teraz zastanawiam się: czy to ze względu na niepełną realizację typu wnioskowania w javac, albo ja tworzenia nieprawidłowy typu drzewo z wezwaniem do1(leA)?

Bo według mojej wiedzy:

  • w do1(leA): Capture(? extends A) staje się supertypem od C
  • w do2(leA): Capture(? extends A) staje się supertypem C (pośrednio przez: Capture(? extends A) == D i D :> C

znaczenia w obu sytuacjach C powinien (bez błędów) rozwiązać na "? extends A"

+4

Mogę odtworzyć to z JDK 1.8.0_51. FYI, Eclipse Mars.2 kompiluje to dobrze ... – Tunaki

+1

Kompiluje OK dla mnie też używając '1.8.0_91-b14'. IIRC, aktualizacja 40 była błędna - mógł to być jeden z błędów. Może po prostu zaktualizuj swoją wersję Java. – Bohemian

+1

dzięki za aktualizację do wersji 1.8.0_92 nadal otrzymuję ten sam błąd kompilacji: http://pastebin.com/tEUfX2JC –

Odpowiedz

-2

Trzeba extends C nie super C:

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

super z C IS i przodka, nie podklasą.

+0

Zbadałem również tę opcję, a ona się skompiluje (spowoduje to, że drzewo typów do 1 będzie inne niż do2). Ale interesuje mnie, dlaczego metody z drzewkami podobnymi do podobnych nie kompilują się pomyślnie. –