两种方法之间的Java差异(泛型)

时间:2015-12-11 14:28:47

标签: java generics

考虑类层次结构

public class A {
    public void say() {
        System.out.println("I am A");
    }
}

public class B extends A {
    public void say() {
        System.out.println("I am B");
    }
}

在第三节课中,我有两种不同的方法

private static void print(A input) {
}

private static <T extends A> void print2(T input) {
}

他们之间的“差异”是什么?

我可以使用A的实例和A的所有子类调用它们:

public class Test {

    private static void print(A input) {
        input.say();
    }

    private static <T extends A> void print2(T input) {
    }

    public static void main(String[] args) {
        B b = new B();
        print(b);
        print2(b);
    }
}

感谢您的帮助!

P.S。:

之间的区别
private static void print(java.util.List<A> input) {
}
private static <T extends A> void print2(java.util.List<T> input) {
}

很清楚!

1 个答案:

答案 0 :(得分:4)

从实际的原因来看,那里没有那么大的区别。 您可以通过

调用第二种方法
<B>test2(new B());

当你尝试使用A

时会失败
<B>test2(new A()); //Compile error

虽然这对它没有大的用处。

然而: 例如,通用声明确实会出现添加返回类型。

public void <T extends A> T test2(T var) {
    //do something
    return var;
}

您可以致电:

B b = new B();
B b2 = test2(b);

虽然在没有泛型的情况下调用类似的方法会需要强制转换。