Java泛型和原始类型

时间:2012-12-06 20:58:36

标签: java generics parameters raw-types

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

  

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

所有方法似乎都运行良好。但我想知道哪个是更好的解决方案。

3 个答案:

答案 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) { ... }