假設我保持T
某一類的子類,的註冊表:如何在運行時獲得通配符上限的類型?
public class ClassRegistry<T> {
Set<Class<? extends T>> klasses;
...
public void register(Class<? extends T> klass) {
klasses.add(klass);
}
你與像registry.register(this.getClass())
呼叫註冊自己。我想就這個簡單的與ClassRegistry<T>
的方法,你只傳自己,this
,如registry.register(this)
:
public void register(Object obj) {
Class<?> klass = obj.getClass();
this.register(klass);
}
哎呀,這是錯誤的,因爲它自稱(匹配與參數類型Object
和過載當然不是,Class<? extends T>
)。所以,相反:
public void register(Object obj) {
Class<? extends T> klass = obj.getClass();
this.register(klass);
}
現在當然不編譯,因爲編譯器不知道你obj
實際上是某種類型的? extends T
的。這可能不會,因爲主叫方可能是錯的。
所以我的問題是:我如何測試/驗證obj
是T
這是一個通配符上限(所以我可以安全地施放)的子類? (我懷疑 - 或許希望 - 答案涉及番石榴的TypeToken
,這就是爲什麼我加了番石榴標籤,但我會採取任何答案,謝謝!)
爲什麼'register'接受'Object'而不是'T'? –
有趣的想法 - 如果'T = Class'呢? :) – ZhongYu
@LouisWasserman - 恩,因爲腦屁?無論如何,爲了知道而忽視這一點:我仍然想知道它是如何完成的,因爲我可能有其他理由要知道。 – davidbak