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