public class GenericMethods {
public <A,B,C> void f(A x,B y, C z) {
System.out.println(x.getClass().getName());
System.out.println(y.getClass().getName());
System.out.println(Класс.вывести_то_что_видит_компилятор(y));
System.out.println(z.getClass().getName());
}
public static void main(String[] args) {
GenericMethods gm = new GenericMethods();
gm.<String,Object,GenericMethods>f("Hello", 54, gm);
}
}
问题:
是否有可能以某种方式强制 JVM 显示它在编译阶段正式拥有y的函数内的f()如果使用RTTI,那么我们会看到java.lang.Integer,但是我在泛型中强行指出要取变量所属java.lang.Object的参数化类型。也就是说,我不想看到真正的类型。我需要知道正式...Byy
这是被禁止的。
形式参数仅在编译时存在。编译器会删除有关它们的信息。在运行时可用的类型称为可具体化。
Java 规范中描述了运行时可用类型的标准,泛型类型参数不可用:
其他类型被覆盖
如果你真的想要:
如果您想将类型信息存储为实验,您可以为类参数执行此操作。您可以通过为每个参数类型创建一个匿名类来强制编译器存储有关指定类型的信息。例如,如果您创建一个类:
并创建一个继承自它的匿名类的对象:
,然后该方法
getCompileTimeType将返回Object,并且getActualType-Integer。这是因为编译器为匿名类创建了一个单独的后代,
GenericClass相当于以下类:,它允许您保存反射参数的类型
GenericClass。但是,请记住,编译器将为每个参数类型(等)创建单独的类GenericClass<Integer>,GenericClass<Object>这会对性能产生不利影响。该机制适用于实验和研究编译器和泛型类型的操作。在实践中不值得使用它,因为。该机制极其不明显、效率低下和脆弱。
链接:
类型擦除不会让您识别它。对于运行时,它将无处不在
Object。