【问题标题】:The equivalent of instanceof等价于 instanceof
【发布时间】:2013-05-09 19:14:48
【问题描述】:

不使用 instanceof 的情况是什么?也许在使用 true、false 或 else 语句时更简单?

public static void p (Object...ar)
{
        for (int i=0; i < ar.length; i++)
        {
                if (ar[i] instanceof int[])
                {

【问题讨论】:

  • 为什么需要替代品?
  • 这样我可以更好地理解instanceof。
  • 真的没有比instanceof低级别的东西了;对于同一个问题,只有更高层次的东西和完全不同的方法。
  • @LouisWasserman Class 方法isInstance 并不是更高级别或完全不同。
  • 您拥有检查类型所需的三个基本元素、输入 (ar[i])、类型引用 (int[]) 和执行检查的运算符 (instanceof)。对你来说,还有什么比这更简单的呢?

标签: java if-statement instanceof


【解决方案1】:

对于原始数组,您可以,而不是:

if (ar[i] instanceof int[])

用途:

if (ar[i].getClass() == int[].class)



注意: 上面的代码适用于原始类型的数组。但请注意,instanceof 还会检查左侧的对象是否是右侧类的子类型,而 == 不会。
对于对象,等效于(myInstance instanceof MyClass[])(检查子类型)是:

(   MyClass[].class.isAssignableFrom(  myInstance.getClass()  )   )

【讨论】:

  • 需要注意的一点:如果ar[i] 为空,这有一个缺点(或者可能是优点,如果这是应该抛出的错误,但通常不会)将抛出NullPointerException
  • 请注意,一般a instanceof A确实暗示a.getClass() == A.class
【解决方案2】:

另一种选择是假设它是int[],如果不是,则捕获结果异常:

public static void p (Object...ar)
{
    for (int i=0; i < ar.length; i++)
    {
        int[] i_arr;
        try {
            i_arr = (int[]) ar[i];
        } catch (ClassCastException e) {
            continue;
        }
        //...

【讨论】:

  • 你使用异常作为流控制,应该避免的事情
  • -1 用于将异常用作流控制,尤其是在存在简单替代方案时。
  • @JavaMentor:我是吗?这与尝试打开文件并在文件不存在时跳过它有什么不同吗?这也会引发异常。流量控制在某种程度上不是例外吗?否则,它们就是错误代码。
  • 我不确定我是否完全同意这一点。在某种程度上你期望它,否则你永远不会抓住它。话虽如此,在 java 的上下文中,CheckDontCatch 表示这可能是个坏主意。
  • @JavaMentor:好吧,你不能按照 OP 使用 instance of,所以他正在用另一种方式来做。
【解决方案3】:

你可以使用:

(getClass().isArray())

并检查是否为整数数组:

 ar.getClass().toString().equals("class [I")

更新

if(ar.getClass().isArray()) {
        if(ar[i].getClass() == int[].class)
            ....
        else if(ar[i].getClass() == String[].class)
            ....
}

【讨论】:

  • 数据类型检查怎么样(即它是一个整数数组)?
  • 查看 Class.getComponentType()
  • 我是 Java 新手。我在使用 true、false 或 else 语句时寻找更简单的东西?
  • 当您进一步检查数组类型时,ar.getClass().isArray() 检查是否有任何价值?
【解决方案4】:

一般来说,继承和多态是解决问题的更好方法。与其检查您正在处理的对象类型,不如让多个类从一个泛型类继承,并调用共享方法。

【讨论】:

  • 如果是数组,这是不可能的。
  • 等等,你是存储对象还是数组?因为如果您在数组中存储不同类型的对象,它在数组中确实可以正常工作。
【解决方案5】:

查看java.lang.Class,它有一个方法isAssignableFrom(Class&lt;?&gt; cls)

对于您使用数组的具体示例,它还有isArray()getComponentType()

【讨论】:

    【解决方案6】:
    Class<?> intArrayCls = int[].class;
    
    ...
    
    if (intArrayCls.isInstance(ar[i])) {
    

    也会成功的。

    JavaDoc of isInstance。它更灵活一点,因为它不仅仅像接受的答案那样测试相等性。

    【讨论】:

      【解决方案7】:

      使用 isAssignableFrom

      public static void test(Object... args) {
          for (int i = 0; i < args.length; i++) {
             if (args[i].getClass().isAssignableFrom(int[].class)) {
              System.out.println("true");
             } else {
                  System.out.println("false");
             }
          }
      }
      

      您也可以以动态方式使用 isAssignableFrom,请参阅这篇文章以了解 instanceof 和 isAssignableFrom 之间的区别 What is the difference between instanceof and Class.isAssignableFrom(...)?

      【讨论】:

        猜你喜欢
        • 2010-10-04
        • 1970-01-01
        • 1970-01-01
        • 2010-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-11
        • 2014-04-14
        相关资源
        最近更新 更多