2014-03-24 209 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。泛型的要点在于避免不正确的转换及其导致的异常。