2012-12-06 127 views
0

當我用這種方法編寫方法時。我收到此警告:Java泛型和原始類型

BaseEvent是一種原始類型。引用泛型類型BaseEvent 應該是參數

@Override 
public <T extends BaseEvent> void actionPerformed(T event) { ... } 

的代碼仍然運行正常,但警告標誌是煩人。當我這樣寫代碼時,警告就消失了。

@Override 
public <T> void actionPerformed(BaseEvent<T> event) { ... } 

有了之前的消息,它並不保證它是BaseEvent的一個子類。於是,我又改變它:

@Override 
public <T extends EventObject> void actionPerformed(BaseEvent<T> event) { ... } 


@Override 
public <T extends BaseEvent<T>> void actionPerformed(BaseEvent<T> event) { ... } 

BaseEvent類是一類我做了一個擴展的EventObject

public abstract class BaseEvent<T> extends EventObject 
{ 
    private String eventType; 

    // Constructor 
    public BaseEvent(Object source, String type) 
    { 
     super(source); 
     eventType = type; 
    } 


    public String getEventType() { return eventType; } 
} 

所有方法似乎很好地工作。但我想知道哪種解決方案更好。

回答

2

你在哪裏在BaseEvent定義中使用T?定義它通過以下方式

public abstract class BaseEvent extends EventObject 

,那麼你不會收到警告

@Override 
public void actionPerformed(BaseEvent event) { ... } 

UPDATE

假設你真的BaseEvent需要被參數。然後寫下面

@Override 
public <T> void actionPerformed(BaseEvent<T> event) { ... } 

這會給你一個參數化的方法。

更新1

It doesn't guarantee that is a subClass of BaseEvent.

它。 <T>是方法模板的參數。根據定義,該參數爲BaseEvent<T>,它是EventObject的子類。

更新2

不要在你的學習的開始使用泛型。泛型只是用於額外的自我測試。使用原始類型。然後,當你開始感覺到它們時,你將正確地參數化它們。

+0

你應該提到你在第一段代碼public void actionPerformed(BaseEvent event){...}中的作用與他在第一段代碼public void actionPerformed(T event){...}'。兩者都採用「BaseEvent」的任何實例,其中當然包括「BaseEvent」的子類。 – newacct

+0

嗨Dims,謝謝你的解釋。我從BaseEvent中取出了類型參數。並感謝您澄清如何在需要時使用它。 – Laani

1

最好的解決方案是避免警告並在編譯時保證您的類型安全。

如果BaseEvent中T的類型不重要,難道你不能只使用你的第一個參數化BaseEvent嗎?這樣做:

@Override 
public <T extends BaseEvent<?>> void actionPerformed(T event) { ... } 

或者,它看起來像你的BaseEvent類不實際使用T任何東西 - 它爲什麼存在?

+0

你不需要它。所以我刪除它。本來我認爲它需要在那裏,所以我可以跟蹤事件的類型。 – Laani

1

類定義中不會使用類型參數T.您可能能夠刪除BaseEvent類型參數:

public abstract class BaseEvent extends EventObject { ... } 

,只是定義你的方法,無需類型參數:

@Override 
public void actionPerformed(BaseEvent event) { ... } 
+0

關於從未使用過T的類的權利我刪除它,它工作正常。 Plus看起來很乾淨 – Laani