我是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];
答案 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();
}
}