2014-03-03 64 views
0

**自java 5;方法返回值基元的協方差。它有效嗎?

我知道,如果在基類中我寫的:

public Number doSomething(){ 
... 
} 

在子類中我可以寫這樣的事情

@Override 
public Integer doSomething(){ 
    ... 
} 

但是我有一個問題。

如果在基類方法中返回 - 原語 - 數組 - 或Collection。

如何在這種情況下使用協變?

+0

你能舉一些這種情況的例子嗎?至少是基類方法? –

回答

8

有原語之間沒有協方差。沒有原始類型是任何其他的子類型。所以你不能做到這一點

class Parent { 
    public int method() { 
     return 0; 
    } 
} 

class Child extends Parent { 
    public short method() { // compilation error 
     return 0; 
    } 
} 

出於同樣的原因,相應的陣列類型intshort也沒有協變的。

對於數組類型,它類似於您Number例如

class Parent { 
    public Number[] method() { 
     return null; 
    } 
} 

class Child extends Parent { 
    public Integer[] method() { 
     return null; 
    } 
} 

同樣,對於Collection類型

class Parent { 
    public Collection<String> method() { 
     return null; 
    } 
} 

class Child extends Parent { 
    public List<String> method() { 
     return null; 
    } 
} 

注意泛型類型參數必須是兼容的(仿製藥沒有協方差,except in bounded wildcards)。

+1

當..太快:) –

+0

無效**收集 **在父母和**收集 **孩子? – gstackoverflow

+0

@gstackoverflow不,因爲協變不適用於泛型類型。見[這裏](http://stackoverflow.com/questions/2660827/java-generics-covariance)和相關的問題/答案。 –

0
  1. 原始:沒有
  2. 陣列:只有當其父母的數組類型
  3. 或集合的子類型:同樣的事情,2