是否有可能以某种方式克服Java中的类型擦除?

时间:2016-02-19 09:04:12

标签: java generics reflection wicket type-erasure

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

1 个答案:

答案 0 :(得分:4)

在使用反射之前很久就会出现问题,如果你解决了这个问题,你就不用再担心了。

由于无法区分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) { }

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