【问题标题】:Is it possible to somehow overcome type erasure in Java?是否有可能以某种方式克服 Java 中的类型擦除?
【发布时间】:2016-02-19 09:04:12
【问题描述】:

事情就是这样。 我们在我们的应用程序中使用了很多 Wicket Panels,出于测试目的,理想情况下它们应该通用生成。从理论上讲,这部分工作:对于构造函数中的每个参数类型,我只有一个可能的参数可以提供,因此需要找到这些参数类型是什么 - 反射。 问题是:类型擦除。许多构造函数使用 Model 类的多个版本作为参数,并带有各种不同类型的参数。类型擦除意味着据我所知,我无法在运行时区分它们。 那么,在这种情况下,有没有办法克服或规避类型擦除?

【问题讨论】:

  • 能贴出相关代码吗?类型擦除是 Java 语言规范的一部分,因此无法“将其关闭”,但可能有解决您的问题的方法。

标签: java generics reflection wicket type-erasure


【解决方案1】:

在您使用反射之前很久就有问题了,如果您解决了这个问题,您就不必再担心了。

由于无法区分Model<A>Model<B>,因此您不能使用这些类型重载两个方法或构造函数。相反,您需要创建一个采用 Model<C> 的方法,其中 C 是 A 和 B 的超类/接口。

你不能这样做

interface A extends C { }
interface B extends C { }

class MyClass {
    MyClass<Model<A> modelA) { }
    MyClass<Model<B> modelB) { }

这不会编译,因为它们在擦除后具有相同的签名,所以你可以这样做

class MyClass {
    MyClass<Model<? extends C> model) { }

这不仅可以编译,而且在运行时也没有歧义。

【讨论】:

    猜你喜欢
    • 2013-12-23
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 2019-06-30
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多