短缺問題
是否有可能無論如何做這樣的事情在Java中:訪問參數化類型參數化類型的
public interface Processor<T extends Producer> {
<T2> T2 process(T<T2> producer);
}
其中生產者被聲明爲Producer<T>
?
長的問題
如果Java類型A是參數與B型,這也是通用的,是有可能在一個以某種方式使用參數化類型B的?我知道,這是神祕的。
比方說,我們有一個通用的接口監製:
此接口的public interface Producer<T> {
T produce();
}
實現意味着是通用的爲好。它們在產生物體的類型上沒有區別,而是在於它們如何生成它們,因此可能存在:DatabaseProducer,RandomProducer等。
我們還有一個Processor接口。處理器的特定實現能夠與生產者的特定實現協同工作,但處理器也不關心處理對象的類型。我們可以很輕鬆地實現這樣的情況:MyProcessor的
public class MyProducer<T> implements Producer<T> {
@Override
public T produce() {
(...)
}
}
public class MyProcessor implements Processor<MyProducer> {
<T> T process(MyProducer<T> producer) {
return producer.produce();
}
}
過程()方法獲取通用MyProducer,只是返回它所產生的。只要生產者爲MyProducer類型,此實現將與String,Integer或其他對象的生產者一起工作。
現在的問題是如何編寫一個通用的處理器接口。該接口使用Producer類型進行參數化,並且該方法應返回相關Producer的參數化類型。
我們不能做這樣的事情:
public interface Processor<T extends Producer> {
<T2> T2 process(T<T2> producer);
}
或類似的東西:
public interface Processor<T extends Producer> {
T.T process(T producer);
}
它甚至有可能在Java中呢?有什麼理由不能或不應該支持它,或者這只是一個缺失的功能?我認爲編譯器可以完全理解這種情況,並檢查類型是否正常。
更新
解決方案有兩個參數化類型,例如:
public interface Processor<T extends Producer<T2>, T2> {
T2 process(T producer);
}
是不是我要找的。請注意,MyProcessor未綁定到任何特定類型的生成對象。從process()方法返回的類型是在調用站點推斷的。
此外我理解類型擦除的工作原理和相關的問題。問題是:由於類型擦除,這種情況是有問題的還是不可能的?我不相信。
如果我們有一個普通的通用方法,例如:
<T> T process(MyProducer<T> producer) {
return producer.produce();
}
我們稱之爲:
MyProducer<String> prod = (...);
String result = processor.process(prod);
然後一切都會好起來。當然,在這種情況下,字符串被擦除,process()和produce()方法都返回結果字節碼中的Object,但編譯器明白MyProducer.produce()實際上會返回String,所以process()也會返回String。我不明白爲什麼它不能在我的情況相同的方式工作:
public interface Processor<T extends Producer> {
<T2> T2 process(T<T2> producer);
}
編譯器從生產者傳遞對象調用現場推斷返回類型,它可以證明,實現在上述同樣的方式是正確的。我認爲Java中唯一缺少的東西是編譯器應該注意到T擴展了泛型,所以T<T2>
可以被視爲類似於Producer<T2>
。也許我在這裏沒有看到重要的東西。
您應該做的第一件事是在您的Java編譯器中啓用所有警告並解決這些警告。特別要注意關於原始類型的警告。 – VGR