/*
* 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