通用方法vs抽象类型到方法

时间:2014-11-14 16:22:11

标签: java generics polymorphism

我想知道以下两种方法是否基本相同?

public static Parent withParent(Parent p) {
    p.doSomething();
    return p;
}

public static <E entends Parent> E withGenericType(E e) {
    e.doSomething();
    return E;
}

public class Child extends Parent {
    @Override
    public void doSomething() {
         System.out.println("override");
    }
}

public static void main(String [] args) {
     // are they the same ?
     withParent(new Child());
     withGenericType(new Child());
}

以及在什么情况下你会使用其中一个?

1 个答案:

答案 0 :(得分:0)

他们不是一回事。

想象一下,你有一个班级Child extends Parent

Child c = new Child();
c = with(c);

这将使用通用版本编译,但不使用非通用版本(因为它返回Parent,而不是Child)。

使用非泛型版本时,您必须将引用转发回Child,依赖于方法的行为以确保这样做:

Child c = new Child();
c = (Child) with(c);

泛型基本上为你添加了这个演员。

你为什么要这样?考虑一下上面的内容:

Child c = with(new Child());