我试图重写子类中从父类继承抽象方法的方法。我正在尝试更改通用返回类型,但我有点困惑。
基本泛型类:
public abstract class BaseAdapter<T extends IEvent> {
private List<T> events;
public BaseAdapter(List<T> events) {
this.events = events;
}
public List<T> sort() {
// Some sorting...
return newFilteredEvents;
}
}
子类:
public class AdapterEvent extends BaseAdapter<Event> {
public AdapterEvents(List<Event> events) {
super(events);
}
}
实现:
public abstract class BaseView extends View {
private BaseAdapter<IEvent> events;
@Override
protected View onCreate(Context context) {
View view = super.onCreate(context);
this.events = getAdapter();
return view;
}
/**
* The child class should provide an adapter
*/
protected abstract BaseAdapter<IEvent> getAdapter();
}
我想重写参数化方法的 subview 类:
public class EventView extends BaseView {
@Override
protected View onCreate(Context context) {
return super.onCreate(context):
}
@Override
protected BaseAdapter<IEvent> getAdapter() {
List<Event> events = EventManager.getInstance().getEvents();
return new AdapterEvent(events);
}
}
这是 Eclipse 抛出错误消息的地方:
Type mismatch: cannot convert from AdapterEvents to BaseAdapter<IEvent>
注意类和接口(interface):Event 和 IEvent:
public interface IEvent {
public void setId(long id);
public long getId();
public void setStartMillis(long start);
public long getStartMillis();
public void setEndMillis(long end);
public long getEndMillis();
}
以及继承自IEvent
的Model类
public class Event implements IEvent {
private long id;
private long startTime, endTime;
@Override
public void setId(long id) {
this.id = id;
}
@Override
public long getId() {
return this.id;
}
// The other inherited methods...
}
我想要实现的是编写更抽象的代码,因为这些类、接口(interface)将由多个类(在我的例子中是不同的 View 类型)扩展。这些是抽象类:BaseAdapter
、BaseView
、IEvent
,这些是实现:AdapterEvent
、事件 View
,事件
。
最佳答案
这是因为 Java 中泛型的类型变量不存在协变。
这意味着如果类型参数对于所需的类型参数是多态的,则泛型类型不具有多态性。实践List<Event>
不是 List<IEvent>
的子类型即使Event
is-a IEvent
.
这就是 Java 提供 wildcards 的原因:
protected abstract BaseAdapter<? extends IEvent> getAdapter();
这样你就可以做到:
protected BaseAdapter<? extends IEvent> getAdapter() {
..
return new AdapterEvent(events);
}
基本上你是在告诉编译器 getAdapter
返回 BaseAdapter
扩展 IEvent
的未指定类型。这可以满足您的需要。
关于Java:重写泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32242898/