为什么我不能使用泛型类型来实现非通用签名

时间:2014-09-23 18:38:11

标签: java generics

我对Java编译器感到有些困惑。

我有一个带有“Object”方法签名的界面:

public interface Bean {
    public void setCreated(final Object created);
}

我想使用泛型来实现它:

public class BeanImpl<T extends Object> implements Bean{
        private T created;

        public void setCreated(final T created){
            this.created = (T)created;
        }
}

但是,这会产生编译器错误:

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

根据定义,T是一个Object(),为什么编译器不允许我创建这个构造?试图标记它是@Override只会产生一个错误消息,该方法实际上不会覆盖超类型。几乎就像编译器不理解/看到T实际上是一个Object。

1 个答案:

答案 0 :(得分:7)

如果允许,那么有人可能会创建

public class Child extends BeanImpl<Integer> {
    public void setCreated(Integer created){
        // whatever
    }
}

Bean bean = new Child();
bean.setCreate(new NotAnInteger());

并且类型安全会破裂。你必须满足界面。

相关问题