Может ли кто-нибудь сказать мне, почему следующее не удается скомпилировать?несовместимые типы с переменными типа
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 поэтому, пожалуйста, не спрашивайте, что я пытаюсь сделать.
http://www.stackoverflow.com/questions/18688882/what-is-the-purpose-of-type-arguments-in-constructor-call-following-new/18688969#18688969 –
Кстати, Параметр 'k' в' create' бесполезен. 'create' может быть объявлен как' public static A create() ' –
newacct
@newacct идиома описана здесь: http://docs.oracle.com/javase/tutorial/extra/generics/literals.html, но я предоставляю это может не иметь смысла в этом примере, поскольку это только SSCCE. TBH мне не совсем понятно, когда использование этой идиомы не является необходимым, но иногда добавление литерала класса явно отключает предупреждения компилятора xlint. –