与类型变量不兼容的类型

时间:2014-02-04 13:13:05

标签: java generics

任何人都可以告诉我为什么下面的编译失败了吗?

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所以请不要问我想要完成什么。

1 个答案:

答案 0 :(得分:5)

  • 摆脱<K>
  • 的构造函数中的A
  • 摆脱<K, V>
  • 的构造函数中的B

构造函数不需要重新定义类的类型参数。如果你这样做,它们被定义为隐藏类中的那些的新类型参数(Eclipse警告你)。