簡體   English   中英

如何在泛型類中返回對象的泛型類型?

[英]How to return the generic type of an object inside generic class?

我想編寫一個通用服務,該服務應與特定類型的對象一起使用。 當我編寫該服務的自定義實現時,我想反對是可變的。 因此,我想覆蓋創建該對象的方法。

但這是行不通的。 在Java中不可能實現以下目標嗎?

class MyService<T extends Foo> {
    //Type mismatch: cannot convert from Foo to T
    public T createObject() {
        return new Foo();
    }

    public void run() {
        T t = createObject();
        //work with the object
    }
}

class Bar extends Foo;
class CustomService<Bar> {
    @Override
    public Bar createObject() {
        return new Bar();
    }
}

問題是您正在提供返回Foo的默認實現。 該實現不適用於子類,並且無法強制子類重寫。

您應該具有MyService<T>abstract T createObject() 對於Foo使Foo特異性亞類FooService<Foo>

class NewArrayList extends ArrayList {

}

abstract class MyService<T> {
    public abstract T createObject();

    public void run() {
        T t = createObject();
        //work with the object
    }
}

class CustomService extends MyService<NewArrayList> {
    @Override
    public NewArrayList createObject() {
        return new NewArrayList();
    }
}

正確; 你不能那樣做。 您的T泛型參數代表“某個類,它是Foo的子類”(其中,一個類是其自身的子類)。 您不能完全假定它 Foo ,因為它可能是擴展Foo的類。

想想看:如果您有一個Bar extends Foo的類,那么您做了:

MyService<Bar> service = ...
Bar myBar = createObject();

那么你的代碼將創建一個Foo ,並嘗試將其向下到Bar -導致ClassCastException 泛型的全部目的是避免不正確的強制轉換及其產生的異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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