我有一个像这样的方法
public <T> T doSomething(Class<T> T) {
return T.newInstance();
}
我也可以这样做,
public T doSomething(Class<T> T) {
return T.newInstance();
}
这两者有什么区别吗?请忽略T.newInstance(),我基本上会以某种方式创建一个新的T实例并将其返回。
感谢, SAM
答案 0 :(得分:8)
方法的返回类型中
<T> T
与T
之间的区别是什么?
没有<T> T
。 <T>
不是返回类型的一部分;它是一个单独的东西,表示类型参数。 (您也可以public <T> void ...
。)
在<T>
版本中,您将T
声明为方法的类型参数,参数中的T
和返回类型指的是该类型参数。
在没有<T>
的版本中,您不将T
声明为方法的类型参数,因此它很可能是包含类的类型参数或另一个包含范围。 (或者,有人可能已经命名了一个实际的类或接口T
,在这种情况下,你应该给那个人说话。)
如果两个版本都编译,那么第二个版本可能是您想要的版本:您可能希望使用类的类型参数T
,而不是添加一个隐藏它的新版本。 (如果你真的想要一个与你的类的类型参数无关的新类型参数,那么你应该使用一个新名称来避免混淆。)
答案 1 :(得分:4)
在第一个示例中,您声明了一个具有自己的类型参数doSomething
的泛型方法<T>
。如果它在泛型类中,则此<T>
与该类可能具有的任何类型参数(甚至是另一个<T>
!)分开。)。
在第二个示例中,您未在doSomething
上声明泛型类型参数。如果类定义<T>
,则此方法仅使用它。如果没有,则T
无法识别,并且会产生编译器错误。
答案 2 :(得分:0)
仅当T被声明为类泛型类型时,第二个选项才有效。如果类没有定义任何泛型类型并且只有其成员函数接受/返回泛型类型,则需要在函数声明中显式声明它。