Class.isInstanceとClass.isAssignableFrom

1.はじめに

このクイックチュートリアルでは、Class.isInstanceClass.isAssignableFromの違いをいきます。それぞれの方法の使い方と、それらの違いは何かを学びます。

2.セットアップ

Class.isInstanceおよびClass.isAssignableFrom機能を探索するときに使用するインターフェイスといくつかのクラスを設定しましょう。

まず、インターフェースを定義しましょう。

public interface Shape { }

次に、Shapeを実装するクラスを定義しましょう:

public class Triangle implements Shape { }

次に、Triangleを拡張するクラスを作成します。

public class IsoscelesTriangle extends Triangle { }

3. Class.isInstance

ClassクラスのisInstanceメソッドは、instanceof演算子と同等です。でisinstanceのそれは動的に使用することができますので、この方法は、Java 1.1で導入されました。このメソッドは、引数がnullでない場合にtrueを返し、ClassCastExceptionを発生させることなく参照型に正常にキャストできます

定義したインターフェイスとクラスでisInstanceメソッドを使用する方法を見てみましょう。

@Test public void whenUsingIsInstanceProperly_desiredResultsHappen() { Shape shape = new Triangle(); Triangle triangle = new Triangle(); IsoscelesTriangle isoscelesTriangle = new IsoscelesTriangle(); Triangle isoscelesTriangle2 = new IsoscelesTriangle(); Shape nonspecificShape = null; assertTrue(Shape.class.isInstance(shape)); assertTrue(Shape.class.isInstance(triangle)); assertTrue(Shape.class.isInstance(isoscelesTriangle)); assertTrue(Shape.class.isInstance(isoscelesTriangle2)); assertFalse(Shape.class.isInstance(nonspecificShape)); assertTrue(Triangle.class.isInstance(shape)); assertTrue(Triangle.class.isInstance(triangle)); assertTrue(Triangle.class.isInstance(isoscelesTriangle)); assertTrue(Triangle.class.isInstance(isoscelesTriangle2)); assertFalse(IsoscelesTriangle.class.isInstance(shape)); assertFalse(IsoscelesTriangle.class.isInstance(triangle)); assertTrue(IsoscelesTriangle.class.isInstance(isoscelesTriangle)); assertTrue(IsoscelesTriangle.class.isInstance(isoscelesTriangle2)); }

ご覧のとおり、右側は左側と同等か、それよりも具体的です。提供ヌルをするでisinstanceメソッドが返すのはfalse

4. Class.isAssignableFrom

Class.isAssignableFromの方法は戻りますならば、クラス文の左側には同じであるか、提供のスーパークラスやスーパーインタフェースであるクラスパラメータ。

isAssignableFromメソッドでクラスを使用してみましょう。

@Test public void whenUsingIsAssignableFromProperly_desiredResultsHappen() { Shape shape = new Triangle(); Triangle triangle = new Triangle(); IsoscelesTriangle isoscelesTriangle = new IsoscelesTriangle(); Triangle isoscelesTriangle2 = new IsoscelesTriangle(); assertFalse(shape.getClass().isAssignableFrom(Shape.class)); assertTrue(shape.getClass().isAssignableFrom(shape.getClass())); assertTrue(shape.getClass().isAssignableFrom(triangle.getClass())); assertTrue(shape.getClass().isAssignableFrom(isoscelesTriangle.getClass())); assertTrue(shape.getClass().isAssignableFrom(isoscelesTriangle2.getClass())); assertFalse(triangle.getClass().isAssignableFrom(Shape.class)); assertTrue(triangle.getClass().isAssignableFrom(shape.getClass())); assertTrue(triangle.getClass().isAssignableFrom(triangle.getClass())); assertTrue(triangle.getClass().isAssignableFrom(isoscelesTriangle.getClass())); assertTrue(triangle.getClass().isAssignableFrom(isoscelesTriangle2.getClass())); assertFalse(isoscelesTriangle.getClass().isAssignableFrom(Shape.class)); assertFalse(isoscelesTriangle.getClass().isAssignableFrom(shape.getClass())); assertFalse(isoscelesTriangle.getClass().isAssignableFrom(triangle.getClass())); assertTrue(isoscelesTriangle.getClass().isAssignableFrom(isoscelesTriangle.getClass())); assertTrue(isoscelesTriangle.getClass().isAssignableFrom(isoscelesTriangle2.getClass())); assertFalse(isoscelesTriangle2.getClass().isAssignableFrom(Shape.class)); assertFalse(isoscelesTriangle2.getClass().isAssignableFrom(shape.getClass())); assertFalse(isoscelesTriangle2.getClass().isAssignableFrom(triangle.getClass())); assertTrue(isoscelesTriangle2.getClass().isAssignableFrom(isoscelesTriangle.getClass())); assertTrue(isoscelesTriangle2.getClass().isAssignableFrom(isoscelesTriangle2.getClass())); }

isInstanceの例と同様に、右側は左側と同じか、左側よりも具体的である必要があることがはっきりとわかります。また、Shapeインターフェイスを割り当てることができないこともわかります。

5.違い

いくつかの詳細な例を示したので、いくつかの違いを見ていきましょう。

  1. isInstanceを使用するには、コンパイル時にクラスの1つが何であるかを知る必要があります。
  2. プリミティブで使用できるのはisAssignableFromのみですプリミティブを使用している場合、ClassオブジェクトとClassパラメータがまったく同じClassである場合にのみ、メソッドはtrueを返すことに注意してください。
  3. isAssignableFromの方法がスローされますNullPointerExceptionが表現のいずれかの側に使用するオブジェクトがある場合はnull。あなたが提供した場合はnullでisinstanceの方法を、それが返されます
  4. isInstanceは、提供されたオブジェクトが比較対象のタイプであるかどうか(直接、インターフェイスまたは継承を介して)の質問に答えるものと考える必要があります。isAssignableFromは、パラメータクラスをオブジェクトクラスとして定義できるかどうかという質問に答えるものと考えることができます。言い換えれば、三角形の三角形=新しいIsoscelesTriange()はコンパイルされますか?

6.結論

この短いチュートリアルでは、我々は両方を見Class.isInstanceClass.isAssignableFrom方法およびその使用を探求し、それらがどのように異なっています。

いつものように、このチュートリアルのサンプルコードはGitHubにあります。