当我以这种方式编写方法时。我收到了这个警告:
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; }
}
所有方法似乎都运行良好。但我想知道哪个是更好的解决方案。
答案 0 :(得分: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
在学习之初不要使用泛型。泛型仅用于额外的自我测试。使用原始类型。然后,当您开始感受它们时,您将正确地对它们进行参数化。
答案 1 :(得分:1)
最好的解决方案是避免警告并在编译时保证您的类型安全。
如果BaseEvent中的T类型无关紧要,你不能只使用你的第一个并参数化BaseEvent吗?做类似的事情:
@Override
public <T extends BaseEvent<?>> void actionPerformed(T event) { ... }
或者,看起来您的BaseEvent
课程实际上并没有使用T
- 为什么会这样?
答案 2 :(得分:1)
类型参数T从不在类定义中使用。您可以从BaseEvent
中删除类型参数:
public abstract class BaseEvent extends EventObject { ... }
只需定义没有类型参数的方法:
@Override
public void actionPerformed(BaseEvent event) { ... }