[英]Java get generic type that represents class from class instance
我可以像這樣聲明類:
class TestClass<K extends TestClass<K>> {
}
我需要一個返回K
類型的方法:
class TestClass<K extends TestClass<K>> {
K getK() {
}
}
如果我返回類實例:
class TestClass<K extends TestClass<K>> {
K getK() {
return this;
}
}
我有關於不兼容類型的錯誤。
當然,我可以做演員:
class TestClass<K extends TestClass<K>> {
K getK() {
return (K) this;
}
}
但在這種情況下,我發出了關於未經檢查的演員的警告。
有沒有辦法在沒有警告抑制的情況下做到這一點?
編輯。 我真正想做的事 - 擁有這兩個課程:
class BaseViewHolder<T extends BaseViewHolder<T, K>, K extends BaseViewModel<T, K>> {
K model;
void setModel(K model) {
this.model = model;
model.setHolder((T) this);
}
}
和
class BaseViewModel<T extends BaseViewHolder<T, K>, K extends BaseViewModel<T, K>> {
T holder;
void setHolder(T holder) {
this.holder = holder;
}
}
我希望每個具體的ViewModel都知道一個相應的具體ViewHolder,並且每個具體的ViewHolder都知道相應的具體ViewModel。
這就是為什么我想擁有這樣的結構。
實際上,我沒有找到另一種方式告訴BaseModel持有者而不是上面。
用這樣的泛型聲明一個類不會使該類成為K的實例。你沒有擴展K.你的演員不僅沒有被選中,而且是錯誤的。
考慮這個例子:
public static void main(String[] args) throws InterruptedException {
new TestClass<AnotherClass>().getK().get0();
}
class AnotherClass extends TestClass<AnotherClass>{
int get0() {
return 0;
}
}
class TestClass<K extends TestClass<K>> {
K getK() {
return (K)this;
}
}
這導致運行時異常:
線程“main”中的異常java.lang.ClassCastException:TestClass無法強制轉換為AnotherClass
基本上當你強制轉換cast (K)
時,你cast (K)
一個TestClass類型的對象轉換為一個擴展TestClass的對象。 另一種方式是真的--K是TestClass但是TestClass不是K.
編輯:
我看到了你的問題,但仍然是演員陣容不正常。 你不知道你將獲得什么樣的BaseViewHolder實現/子類,以及在使用時指向特定類型的泛型。 K是BaseViewHolder的子代,並將任何BaseViewHolder強制轉換為K,這是一個特定的子類是不正常的。
你為什么不這樣做:
class BaseViewModel {
BaseViewHolder holder;
//You can call this setter with any subclass of BaseViewHolder without casting!
void setHolder(BaseViewHolder holder) {
this.holder = holder;
}
}
class BaseViewHolder {
BaseViewModel model;
//You can call this setter with any subclass of BaseViewModel without casting!
void setModel(BaseViewModel model) {
this.model = model;
model.setHolder( this);
}
}
在你的案例中,我看不出任何使用泛型的理由。 使它成為可以擴展BaseViewHolder和BaseViewModel並使用子類作為基類的實例而沒有任何問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.