在涉及有界类型时,我在理解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)
?
来自Java语言规范
擦除类型变量(第4.4节)是擦除其最左边界。
你有
<EventType extends Event>
和
<E extends EventType>
最左边的结合的E
是EventType
,这是另一种类型的变量,其最左边的结合是Event
。所以擦除E
中
public abstract <E extends EventType> void onEventCaught(E event);
是Event
。
类型变量确实出现在.class
文件中,您可以在反射中使用它们。
Class<?> clazz = Foo.class;
TypeVariable typeVariable = clazz.getTypeParameters()[0];
Type type = typeVariable.getBounds()[0];
System.out.println(typeVariable);
System.out.println(type);
印刷
EventType
class com.example.Event
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句