如果不将它作为参数使用,方法前面的类型参数会做什么?

时间:2017-10-30 07:16:56

标签: java generics type-parameter

如果我们有抽象方法

public abstract class Test {
  public abstract <T> void method();
}

然后所有具体派生类都被强制在其方法签名中使用<T>

public class Test1 extends Test {
    public <T> void method() {
        // some code
    }
}

这是什么用例?我们可以对T做些什么? T如何从中得到推论?

2 个答案:

答案 0 :(得分:1)

在这种情况下,没有理由使用泛型参数,但java规范并不禁止它。

那样做的人只是犯了错误。

修改

PS:我发现泛型参数不在方法签名中但仍然有用的情况。 (感谢@JimmyB的想法)

想象一下,你有两个接口:

interface A {}

interface B {}

还有两种具有下一个签名的方法:

<T extends A & B> T f1();

<T extends A & B> void f2(T t);

然后你可以有这样的方法:

<T extends A & B> void foo() {
    T t = f1();
    f2(t);
}

这不是确切的方法,因为它对泛型参数有约束,但它尽可能接近。

答案 1 :(得分:-2)

在这种情况下,泛型的使用仅定义方法的返回。虽然为此你应该在Test类的扩展名定义中传递Object

public class Test1 extends Test<Object1> {
    public Object1 void method() {
        // some code
    }
}

public class Test1 extends Test<Object2> {
        public Object2 void method() {
            // some code
        }
}