0

当我以这种方式编写方法时。我收到这个警告:

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; }   
}

所有方法似乎都可以正常工作。但我想知道哪个是更好的解决方案。

4

3 回答 3

2

T你在哪里使用BaseEvent定义?通过以下方式定义它

public abstract class BaseEvent extends EventObject

那么你不会收到警告

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

更新

假设你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

不要在学习开始时使用泛型。泛型仅用于额外的自我测试。使用原始类型。然后,当您开始感觉到它们时,您将正确地对它们进行参数化。

于 2012-12-06T21:09:49.253 回答
1

最好的解决方案是在编译时避免警告并保证您的类型安全。

如果 BaseEvent 中 T 的类型无关紧要,您不能只使用第一个并参数化 BaseEvent 吗?执行以下操作:

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

或者,看起来您的BaseEvent课程实际上并没有T用于任何事情 - 为什么会在那里?

于 2012-12-06T21:04:37.023 回答
1

类型参数 T 从不在类定义中使用。您也许可以从以下位置删除类型参数BaseEvent

public abstract class BaseEvent extends EventObject { ... }

并且只定义没有类型参数的方法:

@Override
public void actionPerformed(BaseEvent event) { ... }
于 2012-12-06T21:05:54.317 回答