我遇到了这个问题。构造函数不应该具有与类相同的类型参数吗?
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>()
未定义。
答案 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无关。