我正在尝试覆盖子类中从父类继承抽象方法的方法。我正在尝试更改泛型返回类型,但我有点困惑。
基本泛型类:
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();
}
我想在其中覆盖参数化方法的子视图类:
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>
注意类和接口:事件和级别:
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...
}
我试图实现的是编写更抽象的代码,因为这些类、接口将被多个类扩展(在我的例子中是不同的视图类型)。这些是抽象类:< code>BaseAdapter,< code>BaseView,< code>IEvent,这些是实现:< code>AdapterEvent,< code>EventView,< code>Event。
更改基本适配器
这是因为Java中泛型的类型变量没有协方差。
这意味着,如果类型参数对于所需的类型参数是多态的,那么泛型类型就没有多态。练习<代码>列表
这就是为什么Java提供通配符:
protected abstract BaseAdapter<? extends IEvent> getAdapter();
这样你就可以做到:
protected BaseAdapter<? extends IEvent> getAdapter() {
..
return new AdapterEvent(events);
}
基本上,您告诉编译器getAdapter返回一个未指定类型的BaseAdapter
,该适配器
扩展了IEvent
。这允许你需要的东西。
来自Java文档:在类C中声明的实例方法m1覆盖在类A中声明的另一个实例方法m2,如果以下所有条件都为真:。。。。。m1的签名是m2签名的子签名(§8.4.2)。 方法m1的签名是方法m2签名的子签名,前提是:m1的签名与m2签名的擦除相同(§4.6)。 是对一个 如果是这样,什么是错的? EDIT1:或者如果我切换通用类型: 这种情况下有什么问题? EDIT2:我知道如何修复它,但我想了解,在这
这是如何编译的: 但这并不是: 它给我以下编译错误: Impl不是抽象的,并且不会覆盖测试中的抽象方法getValue(整数) 错误:名称冲突:Impl中的getValue(T)和测试中的getValue(Integer)具有相同的擦除,但两者都不重写另一个 擦除不能确保t被整数替换吗?那么为什么第二个例子是无效的呢?
我正在做一个体验,尝试用以下方式重写泛型类的方法: 为什么我不能?编译错误是 yGenFun。java:15:错误:对doX的引用不明确,Do中的方法doX(A)和MyGenFun中的方法doX(T)都匹配x.doX(“测试”);^其中A、T是类型变量:在类Do T中声明的extends对象扩展在类MyGenFun 1 error中声明的CharSequence 如果我注释“第1行”,我可以编译代
安吉丽卡·兰格(Angelica Langer)在关于仿制药的常见问题解答中说(参见Technicalities.FAQ822): 如果这些方法具有具有不同边界的类型参数,则它们不会重写,因为这些方法的签名不是重写等价的。请记住,类型参数边界是泛型方法签名的一部分。 示例(泛型子类型方法重载泛型超类型方法;不推荐): 我不明白为什么方法在类中重载。据我所知,这应该是一个编译时错误,因为在和中具有相
Main.java:12:错误:TextMessage不是抽象的,并且不会覆盖Message类中的抽象方法setContent(T)TextMessage扩展Message{^其中T是类型变量:T扩展方法setContent(T)中声明的Object 1错误
问题内容: 我有一个抽象类 Monitor.java ,它由类 EmailMonitor.java 子类 化 。 方法: 在 Monitor.java中 定义,并且必须在 EmailMonitor.java中 覆盖。 我目前在 EmailMonitor.java中 重写了如下方法: 但是,这会产生编译时错误: 是的子类,因此(至少在我看来)以这种方式覆盖它是很有意义的。看到编译器对我的逻辑不满意,