我有一个问题,关于接口中的正确方法签名是什么,为什么。我的事件带有一个类型参数,但接口是否也应该使用 <T>
在方法签名中使用它?如果是这样,为什么?如果不是,为什么不是?
public interface MyListener {
void beforeAction(final MyEvent event);
}
并且
public class MyEvent<T> extends EventObject {
// code
}
MyEvent
带有类型参数,则需要将MyListener
指定为以下之一:public interface MyListener<T> {
void beforeAction(final MyEvent<T> event);
}
MyListener
的不同类型的 MyEvents
,那么:public interface MyListener {
<T> void beforeAction(final MyEvent<T> event);
}
或者,正如Thomas所说,你可以完全忽略T的类型:
public interface MyListener {
void beforeAction(final MyEvent<?> event);
}
您必须执行上述操作之一,否则将会收到编译器警告,提示您正在使用原始类型。
T
并不重要,那么至少应该将方法定义为 void beforeAction(final MyEvent<?> event);
,以消除警告并保持泛型启用。如果没有任何类型,则编译器将禁用该方法的所有类型检查。T
添加到接口中。public class StringListener implements MyListener<String> {
void beforeAction(final MyEvent<String> event) {
...
}
}
public class NumberListener implements MyListener<Number> {
void beforeAction(final MyEvent<Number> event) {
...
}
}
T
的值,因为该类型信息存储在反射数据中。T
还是 ?
吗? - LuckyLukeT
添加到接口中,并在实现中定义它,如上所示。 - Thomas
T
无关紧要,您可以使用void beforeAction(final MyEvent<?> event);
- Thomas