2013-04-16 40 views
2

我得到了一個接口,就這樣如何在Java中實現這種通用方法?

public interface Reader<T> { 
    T read(Class<T> type,InputStream in); 
} 

它打算從流中讀取類型T的對象的通用接口。然後我知道我要處理的所有對象都是子類,比如說S。所以我創建這個

public class SReader implements Reader<S>{ 
    S read(Class<S> type, InputStream in){ 
     // do the job here 
    } 
} 

Class<S1>不能分配給Class<S>即使S1小號的子類。我如何優雅地實現這一點?有界的類型參數?我不明白。我只是刪除類型參數一樣

public class SReader implements Reader{ 
    // the other stuff 
} 
+0

這是什麼界面和方法的目的是什麼?我不明白你爲什麼要在Reader上指定一個類型參數,同時將一個Class對象傳遞給該方法。 – newacct

+0

在我使用的庫中有一個類似的接口。它用於從提供的輸入流中反序列化特定的類。也許這只是一個故意的舉動,像@Louis Wasserman下面所說的。 – George

+1

好吧,我在想,如果一個'Reader'的實例只能接受一個特定的類,那麼'type'參數總是相同的,爲什麼要在'read()'方法中使用Class對象呢?它可以在構造函數中傳遞,或者'Reader'的特定子類已經專門用於這種類型。 – newacct

回答

8

唯一的解決辦法這聽起來像你想

public interface Reader<T> { 
    T read(Class<? extends T> type,InputStream in); 
} 
+0

我不允許更改原始界面方法簽名。有沒有其他方法可以做到這一點? – George

+0

如果'Foo extends Bar',並且你想從'Reader '中讀取'Bar',那麼不會;您無法將'Class '傳遞給'Reader '。 –

+1

如果您不允許更改界面,那麼也許這是一個_deliberate_動作,以確保您無法讀取子類。 –

相關問題