Java 使用反射(或类似的东西)来执行泛型类型的运行时确定?

Java 使用反射(或类似的东西)来执行泛型类型的运行时确定?,java,generics,reflection,Java,Generics,Reflection,可能重复: 假设我有一个这样的类: public class Foo<T, M> { Pair<T, M> bar; } 公共类Foo{ 对杆; } 有没有办法确定运行时的“T”和“M”是什么?e、 g Foo<String, Integer> foo1 = new Foo<String, Integer>(); Foo<Integer, Boolean> foo2 = new Foo<Integer, Boolean

可能重复:

假设我有一个这样的类:

public class Foo<T, M> {
  Pair<T, M> bar;
}
公共类Foo{
对杆;
}
有没有办法确定运行时的“T”和“M”是什么?e、 g

Foo<String, Integer> foo1 = new Foo<String, Integer>();
Foo<Integer, Boolean> foo2 = new Foo<Integer, Boolean>();
// what happens next?
Foo foo1=new Foo();
Foo foo2=新的Foo();
//接下来会发生什么?

谢谢

不,没有。这几乎就是类型擦除的定义


也就是说,有一些时髦的变通方法。您可以显式地查找该对的组件,并询问它们的类型。你可以在匿名内部类中使用这个很酷的技巧,比如Guava使用的——你不能在运行时确定
new Foo()
的类型,但你可以在运行时确定
new Foo(){}
的类型——注意匿名内部类,它保留了为其超类指定的泛型参数,即
Foo
。(披露:我为番石榴捐款。)

通常,最好的解决方案是首先避免需要这些信息。关于如何做到这一点,没有通用的食谱,但通常是可能的


尽管如此,解决这一需求的唯一通用案例解决方案是显式地传递
元数据。

不,没有。这几乎就是类型擦除的定义


也就是说,有一些时髦的变通方法。您可以显式地查找该对的组件,并询问它们的类型。你可以在匿名内部类中使用这个很酷的技巧,比如Guava使用的——你不能在运行时确定
new Foo()
的类型,但你可以在运行时确定
new Foo(){}
的类型——注意匿名内部类,它保留了为其超类指定的泛型参数,即
Foo
。(披露:我为番石榴捐款。)

通常,最好的解决方案是首先避免需要这些信息。关于如何做到这一点,没有通用的食谱,但通常是可能的


综上所述,解决这一需求的唯一通用案例解决方案是显式地传递
元数据。

运行时通用信息将被删除。一旦您的类编译完成,所有泛型类型信息都将被删除和替换:

泛型类型中的所有类型参数及其边界或对象(如果类型参数是无界的)


运行时通用信息将被删除。一旦您的类编译完成,所有泛型类型信息都将被删除和替换:

泛型类型中的所有类型参数及其边界或对象(如果类型参数是无界的)


实际上,
java.lang.reflect.Field
保留了泛型信息;因此,通过反射,您可以获得泛型信息,但仅限于类/实例变量(不是方法返回类型,也不是局部变量)

在您的例子中,如果foo1和foo2是某个类中的实例变量:

class FooTest {
    Foo<String, Boolean> foo1;
}
class-FooTest{
富富1;
}

然后
FooTest.class.getDeclaredField(“foo1”).getGenericType()
将返回一个
ParameterizedType
实例,您可以在其中检查
getActualTypeArguments()

实际上,
java.lang.reflect.Field
保留了泛型信息;因此,通过反射,您可以获得泛型信息,但仅限于类/实例变量(不是方法返回类型,也不是局部变量)

在您的例子中,如果foo1和foo2是某个类中的实例变量:

class FooTest {
    Foo<String, Boolean> foo1;
}
class-FooTest{
富富1;
}

然后
FooTest.class.getDeclaredField(“foo1”).getGenericType()
将返回一个
ParameterizedType
实例,您可以在其中检查
getActualTypeArguments()

,但您可以确定“哦,不,您正在确定其超类的类型。“注意匿名内部类,它保留为其超类指定的泛型参数”所有类都保留其超类的泛型参数…这就是重点。你是在利用这个事实,但是你可以决定它的类型,不,你是在决定它的超类的类型。“注意匿名内部类,它保留为其超类指定的泛型参数”所有类都保留其超类的泛型参数…这就是重点。你在利用这个事实。