簡體   English   中英

Java獲取表示類實例的類的泛型類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM