Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Android/art/art/test/530-instanceof-checkcast/src/   (Android Betriebssystem Version 17©)  Datei vom 26.5.2026 mit Größe 7 kB image not shown  

Quelle  Main.java

  Sprache: JAVA
 

/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


public class Main {

  static Object exactCheck = new ExactCheck();
  static Object abstractCheckImpl = new AbstractCheckImpl();
  static Object interfaceCheckImpl = new InterfaceCheckImpl();
  static Object normalCheck = new NormalCheck();
  static Object regularObject = new Object();
  static Object objectArray = new Object[2];
  static Object intArray = new int[2];
  static Object doubleArray = new double[2];
  static Object exactArray = new ExactCheck[2];
  static Object normalArray = new NormalCheck[2];

  static Object field;

  public static void main(String[] args) {
    checkInstanceOfNonTryCatch();
    // We also check for a method with try/catch because the compiler then makes a slow
    // path unconditionally save its live registers.
    checkInstanceOfTryCatch();

    checkCheckCast();
  }

  public static void checkInstanceOfNonTryCatch() {
    check(true, exactCheck instanceof ExactCheck);
    check(false, regularObject instanceof ExactCheck);

    check(true, abstractCheckImpl instanceof AbstractCheck);
    check(false, regularObject instanceof AbstractCheck);

    check(true,  interfaceCheckImpl instanceof InterfaceCheck);
    check(false, regularObject instanceof InterfaceCheck);

    check(true, normalCheck instanceof NormalCheck);
    check(true, exactCheck instanceof NormalCheck);
    check(false, regularObject instanceof NormalCheck);

    check(false, regularObject instanceof int[]);
    check(false, objectArray instanceof int[]);
    check(true, intArray instanceof int[]);
    check(false, doubleArray instanceof int[]);

    check(false, regularObject instanceof ExactCheck[]);
    check(false, objectArray instanceof ExactCheck[]);
    check(false, doubleArray instanceof ExactCheck[]);
    check(true, exactArray instanceof ExactCheck[]);
    check(false, normalArray instanceof ExactCheck[]);

    check(false, regularObject instanceof NormalCheck[]);
    check(false, objectArray instanceof NormalCheck[]);
    check(false, doubleArray instanceof NormalCheck[]);
    check(true, exactArray instanceof NormalCheck[]);
    check(true, normalArray instanceof NormalCheck[]);

    check(false, regularObject instanceof Object[]);
    check(true, objectArray instanceof Object[]);
    check(false, doubleArray instanceof Object[]);
    check(true, exactArray instanceof Object[]);
    check(true, normalArray instanceof Object[]);
  }

  public static void checkInstanceOfTryCatch() {
    try {
      check(true, exactCheck instanceof ExactCheck);
      check(false, regularObject instanceof ExactCheck);

      check(true, abstractCheckImpl instanceof AbstractCheck);
      check(false, regularObject instanceof AbstractCheck);

      check(true,  interfaceCheckImpl instanceof InterfaceCheck);
      check(false, regularObject instanceof InterfaceCheck);

      check(true, normalCheck instanceof NormalCheck);
      check(true, exactCheck instanceof NormalCheck);
      check(false, regularObject instanceof NormalCheck);

      check(false, regularObject instanceof int[]);
      check(false, objectArray instanceof int[]);
      check(true, intArray instanceof int[]);
      check(false, doubleArray instanceof int[]);

      check(false, regularObject instanceof ExactCheck[]);
      check(false, objectArray instanceof ExactCheck[]);
      check(false, doubleArray instanceof ExactCheck[]);
      check(true, exactArray instanceof ExactCheck[]);
      check(false, normalArray instanceof ExactCheck[]);

      check(false, regularObject instanceof NormalCheck[]);
      check(false, objectArray instanceof NormalCheck[]);
      check(false, doubleArray instanceof NormalCheck[]);
      check(true, exactArray instanceof NormalCheck[]);
      check(true, normalArray instanceof NormalCheck[]);

      check(false, regularObject instanceof Object[]);
      check(true, objectArray instanceof Object[]);
      check(false, doubleArray instanceof Object[]);
      check(true, exactArray instanceof Object[]);
      check(true, normalArray instanceof Object[]);
    } catch (Throwable t) {
      throw new Error("Unreachable");
    }
  }

  public static void check(boolean expected, boolean actual) {
    if (actual != expected) {
      throw new Error("Expected " + expected + ", got " + actual);
    }
  }

  public static void checkCheckCast() {
    // Exact check.
    field = (ExactCheck)exactCheck;
    try {
      field = (ExactCheck)regularObject;
      throw new Error("Can't reach here");
    } catch (ClassCastException ignore) {}

    // Abstract check.
    field = (AbstractCheck)abstractCheckImpl;
    try {
      field = (AbstractCheck)regularObject;
      throw new Error("Can't reach here");
    } catch (ClassCastException ignore) {}

    // Interface check.
    field = (InterfaceCheck)interfaceCheckImpl;
    try {
      field = (InterfaceCheck)regularObject;
      throw new Error("Can't reach here");
    } catch (ClassCastException ignore) {}

    // Normal check.
    field = (NormalCheck)normalCheck;
    field = (NormalCheck)exactCheck;
    try {
      field = (NormalCheck)regularObject;
      throw new Error("Can't reach here");
    } catch (ClassCastException ignore) {}

    // Primitive array check.
    try {
      field = (int[])regularObject;
      throw new Error("Can't reach here");
    } catch (ClassCastException ignore) {}

    try {
      field = (int[])objectArray;
      throw new Error("Can't reach here");
    } catch (ClassCastException ignore) {}

    field = (int[])intArray;
    try {
      field = (int[])doubleArray;
      throw new Error("Can't reach here");
    } catch (ClassCastException ignore) {}

    // Array with final component type check.
    try {
      field = (ExactCheck[])regularObject;
      throw new Error("Can't reach here");
    } catch (ClassCastException ignore) {}

    try {
      field = (ExactCheck[])objectArray;
      throw new Error("Can't reach here");
    } catch (ClassCastException ignore) {}

    try {
      field = (ExactCheck[])doubleArray;
      throw new Error("Can't reach here");
    } catch (ClassCastException ignore) {}

    field = (ExactCheck[])exactArray;
    try {
      field = (ExactCheck[])normalArray;
      throw new Error("Can't reach here");
    } catch (ClassCastException ignore) {}

    // Array with non final component type check.
    try {
      field = (NormalCheck[])regularObject;
      throw new Error("Can't reach here");
    } catch (ClassCastException ignore) {}

    try {
      field = (NormalCheck[])objectArray;
      throw new Error("Can't reach here");
    } catch (ClassCastException ignore) {}

    try {
      field = (NormalCheck[])doubleArray;
      throw new Error("Can't reach here");
    } catch (ClassCastException ignore) {}

    field = (NormalCheck[])exactArray;
    field = (NormalCheck[])normalArray;

    // Object[] check.
    try{
      field = (Object[])regularObject;
      throw new Error("Can't reach here");
    } catch (ClassCastException ignore) {}

    field = (Object[])objectArray;
    try {
      field = (Object[])doubleArray;
      throw new Error("Can't reach here");
    } catch (ClassCastException ignore) {}

    field = (Object[])exactArray;
    field = (Object[])normalArray;
  }
}

class NormalCheck {
}

final class ExactCheck extends NormalCheck {
}

abstract class AbstractCheck {
}

class AbstractCheckImpl extends AbstractCheck {
}

interface InterfaceCheck {
}

class InterfaceCheckImpl implements InterfaceCheck {
}

Messung V0.5 in Prozent
C=87 H=96 G=91

¤ Dauer der Verarbeitung: 0.11 Sekunden  (vorverarbeitet am  2026-06-29) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.