当前位置: 首页 > 面试题库 >

如何在异构列表中查找给定类型的对象

唐彦
2023-03-14
问题内容

我有一个异构列表,可以包含任何类型的对象。我需要找到某种类型的List元素。浏览其他与泛型相关的问题的答案时,我没有找到我真正需要的东西。

这是我要完成的工作的一个示例:

List <Object> list = new ArrayList <Object>();

...

private someMethod() {
   Customer cust = findInList( Customer.class );
   Invoice inv = findInList( Invoice.class );
}

那么,如何定义findInList泛型?我在这里收集到类型擦除会导致问题的信息,我对此可能不太了解,但是我宁愿不定义多个“查找”方法,因为List中可能存在许多不同类型的对象


问题答案:

您可以使用[
Class.isInstance()](http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#isInstance
(
java.lang.Object))和[
Class.cast()](http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#cast(java.lang.Object))方法。这是一个示例实现(列表带有额外的参数):


static <T> T findInList(List<?> list, Class<T> clazz) {
  for (Object o : list) {
    if (clazz.isInstance(o)) {
      return clazz.cast(o);
    }
  }
  return null;
}

更新:我建议不要在中添加多个类型Collection。这通常是需要自定义数据类型(例如Transaction)或元组值的标志。



 类似资料:
  • 我在弄清楚如何根据给定的类型在构造函数中创建一个新对象时遇到了困难。 例如,我有一个机器人驱动程序,它有一个默认构造函数,不接受任何参数,并创建一个基本的机器人。但我有另一个构造器,根据这个论点创造了一个新的机器人。 是一个接口。那么,如果我想创建,使其是另一种类型,比如?我需要做一些类型的铸造吗?

  • 问题内容: 我有一个接受PDO对象作为参数的方法,以允许用户使用现有连接,而不是该方法打开一个新连接并节省资源: 我知道要检查参数是否为对象,但我想检查是否为PDO对象,而不仅仅是对象。 因为用户可以轻松输入(错误地输入?)另一种对象(一个mysqli或类似的对象),并且整个脚本会破裂。 简而言之:如何检查特定类型对象的变量? 问题答案: 您可以使用: 但是请注意,您不能像否定,所以您应该这样做:

  • 问题内容: Postgres 8.4及更高版本的数据库在public架构中包含公用表,在架构中包含公司特定的表company。 company模式名称始终’company’以公司编号开头和结尾。 因此,可能会有类似以下的模式: 应用程序始终与单个公司一起使用。 的search_path相应指定在ODBC或连接Npgsql的字符串,如: 您如何检查指定表中是否存在给定表companyn? 例如: 应

  • Postgres 8.4和更高版本的数据库在架构中包含公共表,在架构中包含公司特定表。 架构名称始终以开头,以公司编号结尾。 因此可能存在如下架构: 应用程序总是与单个公司一起工作。 相应地在odbc或npgsql连接字符串中指定,如: 如果给定的表同时存在于和传递的模式中,则该函数应返回。 它应适用于Postgres8.4或更高版本。

  • 问题内容: 我有一个由组成的数组。我想遍历它,并找到所有属于数组实例的元素。 如何在Swift中检查对象是否为给定类型? 问题答案: 如果要检查特定类型,可以执行以下操作: 您可以使用“ as!” 如果类型不正确,则会引发运行时错误 您也可以一次检查一个元素:

  • 问题内容: 如果我有一个水果列表,其中包含各种实现,如,等。该列表是必需的,因为其他方法会对列表中的所有水果执行常规操作。 如何将特定类型的所有对象从列表中删除?例如所有的苹果?进行instanceof / if-else检查非常难看,尤其是在有许多不同的类时。 如何改善以下内容? 问题答案: 您应该知道-实例是不好的代码实践。 编写.getType()(返回的对象的枚举类型)怎么办?