2014-02-04 2 views
0

Может ли кто-нибудь сказать мне, почему следующее не удается скомпилировать?несовместимые типы с переменными типа

class A<K> { 

    public <K> A() { 
    } 

    public static <K> A<K> create(Class<K> k) { 
     return new A<K>(); 
    } 
} 


public class B<K, V> { 

    A<K> ak; 

    public <K, V> B(Class<K> klass, V v) { 
     ak = A.create(klass); 
    } 
} 

Он терпит неудачу с:

[javac] /home/.../src/B.java:17: error: incompatible types 
[javac]   ak = A.create(klass); 
[javac]     ^
[javac] required: A<K#2> 
[javac] found: A<K#1> 
[javac] where K#1,V,K#2 are type-variables: 
[javac]  K#1 extends Object declared in constructor <K#1,V>B(Class<K#1>,V) 
[javac]  V extends Object declared in constructor <K#1,V>B(Class<K#1>,V) 
[javac]  K#2 extends Object declared in class B 
[javac] 1 error 

Это SSCCE поэтому, пожалуйста, не спрашивайте, что я пытаюсь сделать.

+0

http://www.stackoverflow.com/questions/18688882/what-is-the-purpose-of-type-arguments-in-constructor-call-following-new/18688969#18688969 –

+0

Кстати, Параметр 'k' в' create' бесполезен. 'create' может быть объявлен как' public static A create() ' – newacct

+0

@newacct идиома описана здесь: http://docs.oracle.com/javase/tutorial/extra/generics/literals.html, но я предоставляю это может не иметь смысла в этом примере, поскольку это только SSCCE. TBH мне не совсем понятно, когда использование этой идиомы не является необходимым, но иногда добавление литерала класса явно отключает предупреждения компилятора xlint. –

ответ

5
  • избавиться от <K> в конструкторе A
  • избавиться от <K, V> в конструкторе B

Конструкторы не нужно переопределить параметры типа класса. Если вы это сделаете, они определяются как новые параметры типа, которые скрывают те, которые содержатся в классе (Eclipse предупреждает вас об этом).

+0

Интересно, однако, что только в в конструкторе B необходимо удалить, в конструкторе A может остаться. Полагаю, это потому, что подпись конструктора A не использует K, поэтому она ничего не скрывает. –

+0

он может остаться, для того, чтобы приведенный выше код работал, но он по-прежнему не так;) – Bozho

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