我对Java编译器有点困惑.
我有一个带有"Object"方法签名的接口:
public interface Bean {
public void setCreated(final Object created);
}
Run Code Online (Sandbox Code Playgroud)
我想用泛型来实现它:
public class BeanImpl<T extends Object> implements Bean{
private T created;
public void setCreated(final T created){
this.created = (T)created;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这会产生编译器错误:
Name clash: The method setCreated(T) of type BeanImpl<T> has the same erasure as setCreated(Object) of type Bean but does not override it
Run Code Online (Sandbox Code Playgroud)
根据定义,T
是一个Object(),为什么编译器不允许我创建这个构造?试图标记它@Override
只是产生一个错误消息,该方法实际上不会覆盖超类型.几乎就像编译器不理解/看到它T
实际上是一个Object.
如果允许,那么有人可能会创建
public class Child extends BeanImpl<Integer> {
public void setCreated(Integer created){
// whatever
}
}
Run Code Online (Sandbox Code Playgroud)
和
Bean bean = new Child();
bean.setCreate(new NotAnInteger());
Run Code Online (Sandbox Code Playgroud)
和类型安全会破裂.你必须满足界面.
归档时间: |
|
查看次数: |
68 次 |
最近记录: |