2014-09-23 74 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

相關問題