Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:获取嵌套参数化类型中的内部类型(反射)_Java_Generics_Reflection_Nested - Fatal编程技术网

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

大多数关于Java中类型擦除处理的文档都假设用例正在处理类似于
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)