什么是运行时签名?

世界末日

在涉及有界类型时,我在理解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)

Sotirios Delimanolis

来自Java语言规范

擦除类型变量(第4.4节)是擦除其最左边界。

你有

<EventType extends Event> 

<E extends EventType>

最左边的结合的EEventType,这是另一种类型的变量,其最左边的结合是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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

什么是运行时绑定?

来自分类Dev

什么是flatpak运行时?

来自分类Dev

什么是运行时约束?

来自分类Dev

如何在运行时获取子例程的签名?

来自分类Dev

为什么ClassCastException是运行时错误?

来自分类Dev

Python的strip()的运行时是什么?

来自分类Dev

什么是“运行时上下文”?

来自分类Dev

什么是C ++运行时概念?

来自分类Dev

为什么要引入运行时?

来自分类Dev

OpenMP运行时需要什么?

来自分类Dev

什么是客观的 c 运行时特性?

来自分类Dev

这段代码的运行时是什么

来自分类Dev

为什么我的程序运行时较长,而本应运行时较短?

来自分类Dev

运行时崩溃

来自分类Dev

算法运行时

来自分类Dev

为什么此异常不会导致运行时错误?

来自分类Dev

Gradle-“运行时”依赖项配置用于什么?

来自分类常见问题

为什么Kotlin集合的运行时类是Java类?

来自分类Dev

array.length的运行时是什么?

来自分类Dev

为什么Python运行时以这种方式处理警告?

来自分类Dev

为什么此代码给运行时分段错误?

来自分类Dev

什么时候抛出运行时异常?

来自分类Dev

为什么会出现运行时错误?

来自分类Dev

在bash命令中运行时,分号会做什么?

来自分类Dev

为什么Java在运行时需要classpath

来自分类Dev

Rails为什么说找不到JavaScript运行时?

来自分类Dev

为什么free(pointer)给运行时错误?

来自分类Dev

在运行时实现接口的好处是什么?

来自分类Dev

为什么在运行时处理虚函数?