在Java中使用一个对象的泛型类型作为另一个对象的类型信息

时间:2011-11-19 15:27:42

标签: java generics

我有一个类型

IDType<IDDataType>

和另一类

SelectionManager<IDDataType>

有没有办法通过传递第一个类的实例来推断第二类对象的数据类型?像这样的东西

IDType<String> idType = new IDType<String>();
SelectionManager<idType.getGenericType()> selectionManager = new Se.....

当然,我想这样做的原因是idType(String就是这里的一个例子)是在完全不相关的地方创建的。

3 个答案:

答案 0 :(得分:0)

您可以在每种方法中声明额外的泛型。

 public <T> void method() {
      IDType<T> idType = new IDType<T>();
      SelectionManager<T> selectionManager = new SelectionManager<T>();

答案 1 :(得分:0)

在java中没有优雅的方法可以执行以下操作:

IDType<String> idType = new IDType<String>();
idType.getGenericType();

这是因为Java编译器在运行时不知道对象的类型。阅读维基百科页面“Generics in Java”上关于“类型擦除”的部分。 Java最初并不是设计用于这些。

你可以随时使用一些肮脏的黑客... instanceof可以完成这项工作,但那是丑陋的编程。

答案 2 :(得分:0)

您编写示例时,您的问题有点难以理解,因为您希望有人调用您的代码来定义类型,但这不是您编写示例的方式。

由于代码目前您可以将其设置为非泛型,因此在编译时您的代码具有所有类型信息。

为了您的示例,必须有一个代码片段A(由其他人编写),其中定义了IDType,然后传递给您编写的代码(代码段B):

IDType<String> idType  = new IDType<String>();
YourClass.yourMethod(idType);

Snippet B(您的代码)看起来像这样:

public <T> void yourMethod(IDType<T> idType){
    SelectionManager<T> selectionManager = new SelectionManager<T>();
}

这意味着selectionManager将具有与idType相同的genericType。

希望这是有道理的!