【问题标题】:Get the class of java.util.Arrays$ArrayList获取 java.util.Arrays$ArrayList 的类
【发布时间】:2016-01-22 17:17:35
【问题描述】:

我如何知道java.util.Arrays$ArrayList 的实例。我试过这段代码 sn-p 但它根本不起作用:

if (myList instanceof Arrays) {
    //Do something here.
}

我已经将对象类类型与 ArrayList 进行了比较,我遇到了同样的问题。但是当我检查对象时,classType 是:

class java.util.Arrays$ArrayList

下面的条件语句是我找到的唯一解决方案:

else if (myList.getClass().toString().equals("class java.util.Arrays$ArrayList")) {
    //do something here
}

但我认为使用 instanceof 控制对象类型会是一个很好的解决方案。

我的问题是:java.util.Arrays$ArrayList 的 classType 是什么,所以我可以使用 instanceof 进行控制。

提前致谢,

奥马尔。

【问题讨论】:

  • instanceof java.util.ArrayList
  • 为什么你需要知道一个类是java.util.Arrays$ArrayList的一个实例?您的代码不应依赖于此。

标签: java android arrays jakarta-ee arraylist


【解决方案1】:

java.util.Arrays$ArrayListArrays私有 内部类,由Arrays.asList 方法返回。

由于它是一个私有类,因此无法以可以与instanceof 运算符一起使用的方式访问该类。但是,您可以使用反射进行此检查:

Class<?> clazz = Class.forName("java.util.Arrays$ArrayList");
// ...
clazz.isAssignableFrom(myList)

但我不建议这样做。这是一个很好的做法to program against an interface。在这种情况下,List 接口定义了对象的行为。 对象的实际类无关紧要。

【讨论】:

  • 感谢您的帮助我不知道在 ClassA$ClassB 的情况下 ClassB 是 ClassA 的私有内部类。
【解决方案2】:

如果列表来自Arrays#asList,则返回的ArrayList 不是java.util.ArrayList,因此与此类的比较总是会失败。

问题是,为什么你需要知道它正是这个实现?也许检查java.util.List就足够了?

一般来说,为什么需要 instanceof 运算符是值得怀疑的,通常还有其他更好的设计解决方案。

【讨论】:

  • 这是因为我正在从事的项目的性质。我收到了一个 Arrays.asList() 列表,但我无法更改它,因为我没有处理项目的这一部分。最后,解决方案是让负责创建列表的人向我发送一个 java.util.ArrayList 并且它成功了!无论如何感谢您的帮助!
  • 您也可以简单地将检索到的列表包装在一个新列表中,然后您可以进一步使用它
【解决方案3】:

您为什么使用 Arrays ?您必须像在此代码中一样使用ArrayList

if (myList instanceof ArrayList) {
    //Do something here.
}

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 2019-08-09
    • 1970-01-01
    相关资源
    最近更新 更多