2014-03-24 104 views
1

我想寫一個通用服務,應該與一個特定類型的對象一起工作。當我編寫該服務的自定義實現時,我想反對變量。因此我想覆蓋創建該對象的方法。如何返回泛型類中的對象的泛型類型?

但它不起作用。在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(); 
    } 
} 

回答

2
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(); 
    } 
} 
2

問題是您提供的默認實現將返回Foo。該實現不適用於子類,並且無法強制子類重寫。你應該有MyService<T>abstract T createObject()。對於Foo製作Foo特定子類FooService<Foo>

1

正確;你不能那樣做。您的T泛型參數代表「某個類是Foo的子類」(其中一個類是其自身的子類)。你不能假定它正好是Foo,因爲它可能是一個延伸Foo的類。

想想看:如果你有一個類Bar extends Foo和你做:

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

那麼你的代碼將創建一個Foo,並嘗試將其向下到Bar —導致ClassCastException。泛型的要點在於避免不正確的轉換及其導致的異常。