2014-09-23 66 views
3

我对Java编译器有点困惑。为什么我不能使用通用类型来实现非通用签名

我有,有一个方法签名与“对象”的接口:

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

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

然而,这将产生一个编译器:

public interface Bean { 
    public void setCreated(final Object 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(),为什么d编译器不允许我构造这个构造吗?试图标记它是@Override只是产生一个错误消息,该方法实际上并未覆盖超类型。这几乎就好像编译器不理解/看到T实际上是一个对象。

+3

这是因为'foo(String)'不重写'foo(Object)',它** **重载**它。 – biziclop 2014-09-23 18:40:05

+0

对。尝试在你的'setCreated()'方法上放置“@Override”注释,你会马上看到问题。 – markspace 2014-09-23 18:42:44

回答

7

如果是允许的,有人可能会随后可能创造

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

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

和类型安全将打破。你必须满足界面。

+0

正确。但是,您可以收紧返回值。 – biziclop 2014-09-23 18:46:07

+0

够公平的。没有完全想到它。 – 2014-09-23 18:50:06

相关问题