2014-11-14 96 views
0

我想知道下面的两个方法是否基本上是相同的东西?泛型方法vs抽象类型的方法

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

只要DoSomething的()没有在子类中重写那么他们应该做同样的事情... – brso05 2014-11-14 16:23:31

+0

什么是通用的'with'如果您提供的返回类型一个类型为“Child”的参数? – 2014-11-14 16:24:55

回答

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()); 
+0

但父母p = with(new Child());如果我真的不关心它返回的实际类型? – peter 2014-11-14 16:34:08

+0

@Nizil一个孩子是一个父母,但这并不意味着'Parent p = new Child();子c = p;'会编译。 – yshavit 2014-11-14 18:05:59

+0

@ user1389813如果你不关心类型,那么是的,你不需要泛型。 – yshavit 2014-11-14 18:06:21