私は、Javaにinstanceof
演算子があることを学びました。どこで使われているか、そしてその利点は何ですか?
基本的には、オブジェクトが特定のクラスのインスタンスかどうかを確認します。通常は、スーパークラスまたはインタフェース型のオブジェクトへの参照またはパラメータがあり、実際のオブジェクトに他の型があるかどうかを知る必要がある場合(通常、より具体的)に使用します。
例:
public void doSomething(Number param) {
if( param instanceof Double) {
System.out.println("param is a Double");
}
else if( param instanceof Integer) {
System.out.println("param is an Integer");
}
if( param instanceof Comparable) {
//subclasses of Number like Double etc. implement Comparable
//other subclasses might not -> you could pass Number instances that don't implement that interface
System.out.println("param is comparable");
}
}
その演算子を頻繁に使用しなければならない場合は、通常、設計にいくつかの欠陥があることがヒントです。そのため、うまく設計されたアプリケーションでは、できるだけその演算子を使用する必要があります(もちろん、その一般規則には例外があります)。
instanceof
は、オブジェクトがクラスのインスタンス、サブクラスのインスタンス、または特定のインターフェースを実装するクラスのインスタンスのいずれであるかを確認するために使用されます。
instanceof
はオブジェクトの 実際 型を決定するために使用できます。
class A { }
class C extends A { }
class D extends A { }
public static void testInstance(){
A c = new C();
A d = new D();
Assert.assertTrue(c instanceof A && d instanceof A);
Assert.assertTrue(c instanceof C && d instanceof D);
Assert.assertFalse(c instanceof D);
Assert.assertFalse(d instanceof C);
}
instanceof は、オブジェクトが指定されたタイプであるかどうかをテストするために使用できるキーワードです。
例:
public class MainClass {
public static void main(String[] a) {
String s = "Hello";
int i = 0;
String g;
if (s instanceof Java.lang.String) {
// This is going to be printed
System.out.println("s is a String");
}
if (i instanceof Integer) {
// This is going to be printed as autoboxing will happen (int -> Integer)
System.out.println("i is an Integer");
}
if (g instanceof Java.lang.String) {
// This case is not going to happen because g is not initialized and
// therefore is null and instanceof returns false for null.
System.out.println("g is a String");
}
}
これが私の source です。