2014-11-14 95 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