[英]Java generics and raw type
當我以這種方式編寫方法時。 我收到此警告:
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; }
}
所有方法似乎都可以正常工作。 但是我想知道哪種方法更好。
您在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
在學習之初,請勿使用泛型。 泛型僅用於其他自我測試。 使用原始類型。 然后,當您開始感覺到它們時,就可以正確地參數化它們。
最好的解決方案是避免警告並在編譯時確保類型安全的解決方案。
如果BaseEvent中T的類型無關緊要,您是否不能只使用第一個參數化BaseEvent? 做類似的事情:
@Override
public <T extends BaseEvent<?>> void actionPerformed(T event) { ... }
另外,看起來您的BaseEvent
類實際上沒有使用T
進行任何操作-為什么在其中呢?
類型參數T從未在類定義中使用。 您也許可以從BaseEvent
刪除type參數:
public abstract class BaseEvent extends EventObject { ... }
並只定義沒有類型參數的方法:
@Override
public void actionPerformed(BaseEvent event) { ... }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.