从泛型类型创建类或超类的实例

时间:2012-03-29 13:27:45

标签: java

我是Java新手。 我正在为Android开发类似于iOS应用的程序。 应用程序的目的之一 - 从服务器获取数据。 数据通常是数组词典,例如“id = 1”,“name = SomeName”。 我上课了

class BaseArrayList<Type extends BaseItem> extends BaseItem {

public void processObject(Map<?,?> map) {
     //......
     //Some loop body
     Type item =  (Type) Type.create();
     item.processObject(map);
     //.....
}

BaseItem也有方法create():

public static BaseItem create() {
    return new BaseItem();
}

它可以工作,但对于BaseItem的子类 - 它不起作用。 我发现静态方法不会重写。

那么,我如何解决这个问题:在数组中创建自定义类,只需创建BaseArrayList的自定义实例,如:

new BaseArrayList<SomeSublassOfBaseItem>

此问题已在ObjC中解决,就像这样 -

[[memberClass alloc] init];

1 个答案:

答案 0 :(得分:1)

  

我发现静态方法没有覆盖。

实际上,覆盖对静态方法不起作用。

有不同的方法可以实现您想要做的事情。一种方法是将Class<Type>对象传递给您的processObject方法,您可以通过调用Type来创建newInstance()的实例:

public void processObject(Map<?, ?> map, Class<Type> cls) {
    // Uses the no-args constructor of Type to create a new instance
    Type item = cls.newInstance();

    // ...
}

另一种更灵活的方法是提供工厂来创建Type的实例。这样做的一个缺点是,您需要为BaseItem的每个子类实现一个工厂,并将其用于此目的。

public interface Factory<T> {
    T create();
}

// ...

public void processObject(Map<?, ?> map, Factory<Type> factory) {
    // Calls the factory to create a new Type
    Type item = factory.create();

    // ...
}

// Factory implementation for BaseItem
public class BaseItemFactory implements Factory<BaseItem> {
    @Override
    public BaseItem create() {
        return new BaseItem();
    }
}