有没有可能克服Java中的类型擦除?

有没有可能克服Java中的类型擦除?,java,generics,reflection,wicket,type-erasure,Java,Generics,Reflection,Wicket,Type Erasure,事情是这样的。 我们在应用程序中使用了大量Wicket面板,出于测试目的,理想情况下,它们应该是一般生成的。从理论上讲,这部分工作是有效的:对于构造函数中的每个参数类型,我只提供一个可能的参数,因此问题在于找到这些参数类型是什么——反射。 问题是:类型擦除。许多构造函数使用Model类的多个版本作为参数,并将各种不同类型的参数添加到该类中。类型擦除意味着,据我所知,在运行时我无法区分这些类型。 因此,在这种情况下,有没有办法克服或避免类型擦除?在使用反射之前很久,您就遇到了一个问题,如果您解决了

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

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

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

你不能这么做

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

class MyClass {
    MyClass<Model<A> modelA) { }
    MyClass<Model<B> modelB) { }
接口A扩展了C{}
接口B扩展了C{}
类MyClass{

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

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

你不能这么做

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

class MyClass {
    MyClass<Model<A> modelA) { }
    MyClass<Model<B> modelB) { }
接口A扩展了C{}
接口B扩展了C{}
类MyClass{

MyClassYou可以发布相关代码吗?类型擦除是Java语言规范的一部分,因此无法“关闭”,但可以解决您的问题。您可以发布相关代码吗?类型擦除是Java语言规范的一部分,因此无法“关闭”但你的问题可能有解决办法。