2016-05-24 86 views
1

我正在開發一個項目,其中一個需求是我們使用一個通用數據類型(其他需求:抽象類,繼承,保存/加載函數,彙總&組合)抽象基類的通用數據類型返回

我想我會創建一個庫來填寫所有的需求,很難想出何時何地使用泛型數據類型,然後似乎很明顯,如果我有一個類稱爲媒體和兩個子類被稱爲CD書的長度是整數(頁),CD的長度是雙倍(分鐘& seco NDS)

我想通這將有助於使這種在媒體:

public abstract class Media<T>{ 
     private T length; 
     //lots of other variables & methods here, took out for sake of cutting to the chase 

     public T getLength(){ 
      return length; 
     } 

     public void setLength(T length){ 
      this.length = length; 
     } 
    } 

問題:

但現在的問題是,它如何可以返回一個類型時,它不會收到一個在getLength中,因此不知道它是哪種類型,除非它以某種方式設置?或者一個解決方案是讓每個子類在構造函數中調用一次該函數來設置它?

我可以以某種方式覆蓋private T length;變量在子類中CD?只是爲了設置它們的類型,使得getLength按照它應該的方式運行,還是有其他解決方案?

可以選擇在其他地方使用通用數據類型,但我不知道它在哪裏是合適的,我的教授甚至挑戰了需求,因此他們讓我知道他們會讓我失敗if他們認爲即使「禮節」不是一個要求,但某些東西「不適用」或「不是一個好例子」。

+0

爲什麼你不使用'Media'作爲接口? –

+0

它在'getLength()'中沒有收到一個類型,但是當你創建'Media '實例時收到一個類型。你能展示一個你打算使用這個'Media'類的代碼的例子嗎? –

+0

@MuratK。抽象類是一個需求 – user326964

回答

1

感謝安迪·特納的解決方案,和其他人的貢獻,但他給了,幫助了答案,這是這樣的:

我所做的:

class Book extends Media{ 
... 
} 
class CD extends Media{ 
... 
} 

我應該」已添加:

class Book extends Media<Integer>{ 
... 
} 
class CD extends Media<Double>{ 
... 
} 
1

這是協變類型的良好情況,Java 1.5或更高版本支持此行爲。泛型是可選的,因爲返回類型是協變的,但可以根據需要添加,並且應該工作得一樣。

public class CovariantTest { 

    public static void main(String[] args) { 
    Media book = new Book(); 
    assert book.getLength().getClass() == Integer.class; 
    Media cd = new Cd(); 
    assert cd.getLength().getClass() == Double.class; 

    //Just for sake of being complete 
    assert book.getLength().getClass() == Number.class; // AssertionError 
    assert cd.getLength().getClass() == Number.class; // AssertionError 

    } 
} 

abstract class Media { 
    private Number length; 

    public Number getLength() { 
    return length; 
    } 

} 

class Book extends Media { 

    @Override 
    public Integer getLength() { 
    return 5; 
    } 
} 

class Cd extends Media { 
    @Override 
    public Double getLength() { 
    return 5.01; 
    } 
}