无法从java.lang.Class <t>转换为java.lang.Class <t> </t> </t>

时间:2011-11-24 04:32:29

标签: java generics compiler-errors

我遇到了这个问题。构造函数不应该具有与类相同的类型参数吗?

public class MyBuilder<T> {

private final Class<T> clss;

/**
 *
 * @param clss
 */
public <T> MyBuilder(final Class<T> clss) {
    this.clss = (Class<T>) clss; // compiler error here
}


Type mismatch: cannot convert from java.lang.Class<T> to java.lang.Class<T>

如果我删除它编译的<T>,但我不能这样做:

MyBuilder<Foo> myBuilder = new MyBuilder<Foo>();   // compiler error here

错误是构造函数MyBuilder<Foo>()未定义。

2 个答案:

答案 0 :(得分:8)

从构造函数中删除type参数,以及强制转换:

public MyBuilder(final Class<T> clss) {
   this.clss = clss;
}

对于任何实例成员(包括构造函数),都隐式声明了类的类型参数T。通过为构造函数显式声明T,您实际上正在屏蔽类声明的T,从而导致混淆错误。

答案 1 :(得分:5)

因为这个“T”不是“T”。 T只是某种类型的“占位符”。

中的T.
private final Class<T> clss;

与构造函数参数中的T无关。