【问题标题】:How to Cast the Class Object of a Generic Type to a Specific Instance of that Type如何将泛型类型的类对象转换为该类型的特定实例
【发布时间】:2013-05-20 01:26:54
【问题描述】:

我有一个通用接口,我们称之为GenericInterface<T>。我需要将该接口的 类对象 传递给期望(通过另一个类型参数指定)该类型的特定实例的方法。假设我想打电话给java.util.Collections.checkedList()

List<GenericInterface<Integer>> list = Collections.checkedList(
    new ArrayList<GenericInterface<Integer>>(),
    GenericInterface.class);

这不起作用,因为Class&lt;GenericInterface&gt; 不能隐式转换为Class&lt;GenericInterface&lt;Integer&gt;&gt;,那么最安全的方法是什么?我能想到的最好的是:

List<GenericInterface<Integer>> list = Collections.checkedList(
    new ArrayList<GenericInterface<Integer>>(),
    (Class<GenericInterface<Integer>>) (Class<?>) GenericInterface.class);

它有效,但不会保护我免受例如将列表的类型更改为List&lt;SomeOtherInterface&gt;,而不用SomeOtherInterface.class 替换类对象参数。

【问题讨论】:

  • 我知道在这个例子中,checked 列表实际上不会检查添加到列表中的GenericInterface 实例的类型参数T,这不是我想要的。如果可能的话,我只是希望对checkedList() 的调用更加类型安全。
  • 这是你能做的最好的事情
  • 这是一个完美的例子,说明你可以只做未经检查的演员表并压制它。您正在控制委托列表的创建,因此无需担心。但是 Java 不能让你不抱怨就去做,因为据它所知,强制转换可能会导致类型错误。

标签: java generics casting


【解决方案1】:

有类似的问题:

简短的回答是,没有办法找出运行时类型 Java 中的泛型类型参数。

【讨论】:

  • 这并没有解决我的问题。这可能符合checkedList() 的实现者的利益,但我只需要将具有正确非泛型类型的Class 实例传递给具有泛型类型的参数即可。
  • 在这种情况下删除类的泛型类型List&lt;GenericInterface&gt; list = Collections.checkedList( new ArrayList&lt;GenericInterface&gt;(), GenericInterface.class);
  • 但这比我开始时的类型安全性差!在我的第二个示例中,只有调用checkedList() 的第二个参数不是类型安全的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多