2012-12-06 130 views
0

当我用这种方法编写方法时。我收到此警告:Java泛型和原始类型

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

所有方法似乎很好地工作。但我想知道哪种解决方案更好。

回答

2

你在哪里在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

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

+0

你应该提到你在第一段代码public void actionPerformed(BaseEvent event){...}中的作用与他在第一段代码public void actionPerformed(T event){...}'。两者都采用“BaseEvent”的任何实例,其中当然包括“BaseEvent”的子类。 – newacct

+0

嗨Dims,谢谢你的解释。我从BaseEvent中取出了类型参数。并感谢您澄清如何在需要时使用它。 – Laani

1

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

如果BaseEvent中T的类型不重要,难道你不能只使用你的第一个参数化BaseEvent吗?这样做:

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

或者,它看起来像你的BaseEvent类不实际使用T任何东西 - 它为什么存在?

+0

你不需要它。所以我删除它。本来我认为它需要在那里,所以我可以跟踪事件的类型。 – Laani

1

类定义中不会使用类型参数T.您可能能够删除BaseEvent类型参数:

public abstract class BaseEvent extends EventObject { ... } 

,只是定义你的方法,无需类型参数:

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

关于从未使用过T的类的权利我删除它,它工作正常。 Plus看起来很干净 – Laani