Java:获取嵌套参数化类型中的内部类型(反射)
大多数关于Java中类型擦除处理的文档都假设用例正在处理类似于Java:获取嵌套参数化类型中的内部类型(反射),java,generics,reflection,nested,Java,Generics,Reflection,Nested,大多数关于Java中类型擦除处理的文档都假设用例正在处理类似于SomeType的类型。 我正在尝试处理以下方法的方法参数: public void setOtherReferenceRanges(List<ReferenceRange<T>> referenceRanges) public void setOtherReferenceRanges(列出referenceRanges) 当容器类实例化为DvQuantity类型时,此签名应为 public void se
SomeType
的类型。
我正在尝试处理以下方法的方法参数:
public void setOtherReferenceRanges(List<ReferenceRange<T>> referenceRanges)
public void setOtherReferenceRanges(列出referenceRanges)
当容器类实例化为DvQuantity类型时,此签名应为
public void setOtherReferenceRanges(列出referenceRanges)
在运行时
使用反射可以看到列表
有一个实际类型参数
,它是引用范围
。由于反射使用类信息,我不希望它给我ReferenceRange
。
但是,当我创建包含此方法的类时,我将DvQuantity
类型传递为T
。因此,填充T
的类型应该可用于Java运行时,但我找不到一种方法来获得它。我最终得到了一个通过反射访问的typevariableempl
对象,它似乎不包含任何有用的数据
您能想出任何方法在运行时发现这些信息吗 泛型类型信息在运行时不可用。当我需要在运行时确保某种类型时,我会传入一个类参数:
public <T> void doSomething(T t, Class<T> c);
公共无效剂量(T T,c类);
这并不总是方便,甚至不可能,但在许多情况下,这是可能的。当你说
当我创建包含此方法的类时
我猜您的意思是当您创建该类型的对象时,例如:
foo = new ContainerClass<DvQuantity>();
或者,更简短地说,是一个内联匿名子类(看起来几乎像第一个示例,但有一个细微但重要的区别):
因此,在Java运行时应该可以使用T中填充的类型,但是我找不到一种方法来获得它
也许这并不完全正确,但我认为在运行时没有实际的类——只有一个没有满足T接口的特定类型的对象。换句话说,擦除不是发生在对象上,而是发生在这些模糊(至少在OOP世界中)类型的东西上
有一些方法可以捕获类本身内部的类型信息(T类型需要一个方法getUnderlyingType()…或其他什么),但这不是一个好主意。如果您确实需要创建对象的原始类型,我会重新考虑使用泛型。谢谢您的回复。它验证了我到目前为止所看到的。不幸的是,我没有设置的权力,我需要使这项工作。还要感谢其他的回应,如果我能控制局势,所有这些都会很有用。
class DvQuantityContainerClass extends ContainerClass<DvQuantity> {...}
...
foo = new DvQuantityContainerClass();
foo = new ContainerClass<DvQuantity>(){};
Method m = DvQuantityContainerClass.class.getMethod("setOtherReferenceRanges", List.class);
// this will return List<ReferenceRange<DvQuanity>>, like you are lookingn for
return GenericTypeReflector.getExactParameterTypes(m, DvQuantityContainerClass.class)