在方法的返回类型中<t> T与T之间有什么区别?</t>

时间:2013-12-20 22:22:45

标签: java generics

我有一个像这样的方法

public <T> T doSomething(Class<T> T) {
return T.newInstance();
}

我也可以这样做,

public T doSomething(Class<T> T) {
return T.newInstance();
}

这两者有什么区别吗?请忽略T.newInstance(),我基本上会以某种方式创建一个新的T实例并将其返回。

感谢, SAM

3 个答案:

答案 0 :(得分:8)

  

方法的返回类型中<T> TT之间的区别是什么?

没有<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被声明为类泛型类型时,第二个选项才有效。如果类没有定义任何泛型类型并且只有其成员函数接受/返回泛型类型,则需要在函数声明中显式声明它。