簡體   English   中英

Java泛型和原始類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM