与类的静态成员的泛型混淆

时间:2017-10-26 14:14:45

标签: java generics

以下代码对我来说非常混乱。

public class Test<T> {
  public static <T> Test<T> ok(T result) {
  ..

我理解班级名称中的泛型。我能理解“ok”方法是否会像这样

public static Test<T> ok(T result) {

或者

public static T ok(T result) {

但为什么会有额外的&lt; T>在测试之前&lt; T>返回类型我不明白。

2 个答案:

答案 0 :(得分:5)

该示例实际上等同于

public class Test<T> {
  public static <U> Test<U> ok(U result) {
  ..

另一个<T>指的是仅适用于该方法的不同泛型类型。为避免混淆,最好为不同的事物使用不同的名称。

答案 1 :(得分:2)

它是静态方法,因此它不受实例的泛型类型参数的影响。

如果您希望200 200方法受泛型参数的约束,则必须将ok类作为工厂制作,只对TestFactory<T>类型进行测试,例如的是:

T

因此,在这种情况下,public class TestFactory<T> { public Test<T> ok(T result) { // ... } } 仅允许TestFactory<String>结果,其他任何内容都是编译器错误。

如果你更喜欢静态方法,你应该做@jurez发布的内容以避免混淆:事实上,这个静态方法的类型参数只取决于给定输入参数的类型。