【发布时间】:2015-02-07 22:09:57
【问题描述】:
当涉及到有界类型时,我在理解 Java 的类型擦除方面有点问题。考虑一下:
class Event {} // From the API
class FooEvent extends Event {}
abstract class Foo<EventType extends Event> {
public abstract <E extends EventType> void onEventCaught(E event);
}
class Bar extends Foo<FooEvent> {
@Override
public void onEventCaught(FooEvent event) {
}
}
显然这编译没有问题。我问自己的问题是,这里声明了Bar#onEventCaught() 的参数类型(如,反射是怎么想的)?
是onEventCaught(FooEvent event) 还是onEventCaught(Event event)?
【问题讨论】:
-
不要将泛型类型命名为您已经拥有的类。例如,您可以创建像
class Foo<String>这样的类,但对于此类,String将代表泛型类型,而不是java.lang.String类型,因此您将无法在其中使用String s = "hello world"。将泛型类型命名为更简单的名称,例如class Foo<T>。 -
@Pshemo 注意到,我想这会避免我在未来的一些混乱......
标签: java reflection type-erasure