【问题标题】:Checking java List<object> object type检查 java List<object> 对象类型
【发布时间】:2013-09-19 00:45:52
【问题描述】:

我有一个返回List&lt;?&gt; 的通用函数。如果它工作正常,它将返回一个List&lt;LightSensor&gt;,但我不能直接将函数的结果转换为List&lt;LightSensor&gt; 类型的变量。如何检查 List 中的类是否正确是 LightSensor? (例如检查List&lt;?&gt; = List&lt;LightSensor&gt;) 另外,检查后正确投射的最佳方法是什么?
顺便说一句,LightSensor 类扩展了 Object 和 Serializable 的一个版本

【问题讨论】:

  • 也许你应该向我们展示你的通用函数。
  • 另外,在 Java 中,我们称它们为“方法”,而不是“函数”。
  • 没什么特别的,为什么要去看?它只返回一个列表>。如果你真的想看的话,去这里:jd.bukkit.org/rb/doxygen/df/d9a/…
  • @Pocketkid2 - 阅读“帮助”。内联代码应该用反引号括起来。
  • @TJamesBoone - 有更好的方法!

标签: java list object casting


【解决方案1】:

如何检查 List 中的类是否正确是 LightSensor? (例如检查List&lt;?&gt; = List&lt;LightSensor&gt;

AFAIK,这样做的唯一方法是迭代列表并在每个元素上使用 instanceof LightSensorgetClass() == LightSensor.class

另外,我检查后正确投射的最佳方法是什么?

只需进行类型转换,并取消“未经检查的转换”警告。

【讨论】:

  • 我应该使用Object 来遍历List&lt;?&gt;吗?
  • @Pocketkid2 - 嗯……是的。你真的别无选择,因为这就是静态类型所说的 List&lt;?&gt; 的元素类型。
【解决方案2】:

从方法返回泛型集合的习惯用法类似于:

public <T> List<T> getTheList(Class<T> cls){
  // you might need the cls in here to create the list.
  ...
}

显然,您使用Class&lt;T&gt; 生成列表的方式是特定于应用程序的。大多数情况下,这在某些类层次结构的上下文中是有意义的,在这种情况下,T 扩展了某些基类或接口:

public <T extends MyBaseClassOrInterface> List<T> getTheList(Class<T> cls){
  ...
}

同样,您创建列表的方式完全取决于应用程序。如果你试图让你的整个应用程序保持强类型,你也许可以避免使用某种黑魔法来找出List&lt;?&gt; 的类型参数。如果您最终得到这样的代码(除非您显然正在处理一些遗留代码),那么这是一种强烈的代码气味。此外,如果列表是空的,你绝对没有希望。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多