當試圖專門實現一個通用接口的類時遇到了問題,我想從超類繼承同一接口,但使用更具體的類型參數。以下片段顯示了一個不能編譯的合成但完整的示例。該註釋包含來自Java編譯器的錯誤消息。在尊重變化的同時多次繼承通用接口
interface Producer<T> {
T get();
}
class NumberProducer implements Producer<Number> {
@Override
public Number get() { return null; }
}
// Producer cannot be inherited with different arguments: <java.lang.Integer> and <java.lang.Number>
class IntegerProducer extends NumberProducer implements Producer<Integer> {
@Override
public Integer get() { return null; }
}
在PECS意義,Producer<T>
是製片,所以Producer<Integer>
將的Producer<Number>
一個亞型,但也沒有辦法,宣佈在Producer<T>
定義。 Java不允許IntegerProducer
從NumberProducer
和Producer<Integer>
繼承,同時IntegerProducer
將同時繼承Producer<Integer>
和Producer<Number>
。
有沒有一個標準的方法來解決這個限制,例如,不需要這種繼承就可以解決相同問題的模式?
你爲什麼要實施IntegerProducer接口?你也可以在不實現接口的情況下覆蓋get()方法。 – 2013-05-07 11:17:27
你能提供一個如何使用這些類的例子嗎?我不確定即使是製作'NumberProducer'通用的常見建議也會做你想做的事情。如果你使用'NumberProducer實現Producer ',你不能返回NumberProducer.get()中'null'以外的任何東西,因爲你不知道'Number'的哪個子類型是'T'。也就是說,你不能返回新的Number()(我知道構造函數不存在,但忍受着我),因爲'T'實際上可能是'Integer'。 –
millimoose
2013-05-07 11:37:25