instanceofがインターフェイスでどのように機能するか
instanceof
を使用して、オブジェクトが特定のクラスの直接のインスタンスであるか、子孫のインスタンスであるかをテストできます。インターフェースをクラスのようにインスタンス化することはできませんが、instanceof
もインターフェースで使用できます。誰でもinstanceof
の仕組みを説明できますか?
まず、特定のinstances
を実装するクラスのinterface
をこのようにinterface reference variable
に格納できます。
package com.test;
public class Test implements Testeable {
public static void main(String[] args) {
Testeable testeable = new Test();
// OR
Test test = new Test();
if (testeable instanceof Testeable)
System.out.println("instanceof succeeded");
if (test instanceof Testeable)
System.out.println("instanceof succeeded");
}
}
interface Testeable {
}
つまり、特定のインターフェイスを実装するランタイムインスタンスはinstanceof
テストに合格します
[〜#〜] edit [〜#〜]
そして出力
instanceof succeeded
instanceof succeeded
なかむら
このような匿名の内部クラスを使用して、インターフェイスのインスタンスを作成できます
Runnable runnable = new Runnable() {
public void run() {
System.out.println("inside run");
}
};
そして、このようなinstanceof
演算子を使用して、インスタンスがインターフェース型であることをテストします
System.out.println(runnable instanceof Runnable);
結果は「true」です
object instanceof object_interface
はtrue
を生成します。
instanceof
に対してreference
のinstance
チェックを行い、特定のinstance
が指しているreference
のタイプをチェックします。 。
これで、interface
の参照を作成できるので、class
を実装するインスタンスを指します(同じ概念、Super class reference
を指しています subclass instance
)。そのため、instanceof
チェックを行うことができます。
たとえば:-
public interface MyInterface {
}
class ImplClass implements MyInterface {
public static void main(String[] args) {
MyInterface obj = new ImplClass();
System.out.println(obj instanceof ImplClass); // Will print true.
}
}
-まず、instanceofを使用して、オブジェクトを保持するオブジェクト参照変数が特定のタイプかどうかを比較します。
例:
public void getObj(Animal a){ // a is an Object Reference Variable of type Animal
if(a instanceof Dog){
}
}
-interface
の場合、implementsできるclass
instanceof
で使用されます。
例:
public interface Brush{
public void Paint();
}
public class Strokes implements Brush{
public void Paint(){
System.out.println("I am painting");
}
}
public class Test{
public static void main(String[] args){
Brush b = new Strokes();
if(b instanceof Strokes){
b.Paint();
}
}
}
hi以下は、instanceOfに対してTrueを生成します。
• If S is an ordinary (nonarray) class, then:
• If T is a class type, then S must be the same class as T, or S must be a subclass of T;
• If T is an interface type, then S must implement interface T.
• If S is an interface type, then:
• If T is a class type, then T must be Object.
• If T is an interface type, then T must be the same interface as S or a superinterface of S.
• If S is a class representing the array type SC[], that is, an array of components of type SC, then:
• If T is a class type, then T must be Object.
• If T is an interface type, then T must be one of the interfaces implemented by arrays (JLS §4.10.3).
• If T is an array type TC[], that is, an array of components of type TC, then one of the following must be true:
- TC and SC are the same primitive type.
- TC and SC are reference types, and type SC can be cast to TC by these run-time rules
明確なアイデアを得るには、このリンクにアクセスしてください。
http://docs.Oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.instanceof
public class Programmers {
public static boolean hasReallife(Programmer programmer) {
return programmer instanceof Reallife; ══════════════════╗
} ║
║
} ║
▼
public class ReallifeProgrammer extends Programmer implements Reallife {
public ReallifeProgrammer() {
diseases.get("Obesity").heal();
diseases.get("Perfectionism").heal();
diseases.get("Agoraphobia").heal();
}
@Override
public void goOut() {
house.getPC().shutDown();
wife.argue();
}
@Override
public void doSports() {
goOut();
BigWideWorld.getGym("McFit").visit();
}
@Override
public void meetFriends() {
goOut();
BigWideWorld.searchFriend().meet();
}
}
これは非常に古い質問であり、多くの良い答えがあります。この演算子を理解する最も簡単な(少なくとも私にとっては最も簡単な)方法を指摘したいと思います。
_o instanceof t
_がtrue
を返す場合、t castedObj = (t) o;
はClassCastException
をスローせず、castedObj
はnull
になりません。
これは後でcastedObj
からフィールドまたはメソッドにアクセスする場合に重要/有用です。instanceof
チェックを行うことで、後で問題が発生することはありません。
唯一の欠点は、これがジェネリックのない型に使用できることです。