インターフェイスに型キャストされた具象クラスですが、JVMはそれを具象クラスのインスタンスと見なしますか?
2 に答える
特定の質問に答える前に、インターフェイスの実装は、インターフェイスタイプが受け入れられる場所であればどこにでも渡すことができることに注意してください。つまり、Implがインターフェイスを実装している場合、Impl isAインターフェイスですが、なぜインターフェイスタイプにキャストするのでしょうか。それは完全に不要です。私はあなたが特定の実装にキャストするが、実装からインターフェースへではない状況を見てきました、そしてそれらの状況でさえ危険です。
次のコードでこれを確認する必要がありましたが、インターフェイス実装があり、それをインターフェイスにキャストした場合、インターフェイスとして渡そうとすると、実装を必要とするものはすべてコンパイル時エラーになります。これがコードです
public class Runner {
public static void main(String[] args) {
ExampleImpl impl = new ExampleImpl(); // never do this in real life
// Example impl = new ExampleImpl() <-- do this instead "code to the interface"
Example casted = (Example) impl;
takesExampleImpl(casted); // compile error because takesImpl expects the implementation
takesExampleImpl(impl); // works because impl is an implementation
takesExampleImpl((ExampleImpl)casted); // works because I cast it back to imple
}
public static void takesExampleImpl(ExampleImpl instance){
}
static class ExampleImpl implements Example {
public void testMethod() {
System.out.println("impl");
}
}
}
例は、1つのメソッドを使用した単純なインターフェイスであり、コードは示されていません。
また、私のコードは質問に答えることに注意してください、それは多くの間違ったことをします-あなたはプロの設定ではそのようなコードを見ないでしょう(または少なくともあなたはそうすべきではありません)。インターフェイスのポイントは、動作を定義し、その動作に準拠するオブジェクトを渡すことができるようにすることです。したがって、実装を受け入れるメソッドを作成するのではなく、実装を提供するものをすべて渡すことができるインターフェイスを受け入れるメソッドを作成します。そうすれば、必要に応じて、同じメソッドに異なる実装を渡すことができます。
割り当てを作成すると、割り当てのタイプは、指定されたタイプに基づいて推測されます。例:MyInterface mi = new MyImplementation(); この場合のmiはインターフェースとして入力されますが、実装を指します。のインスタンスを実行すると、JVMはインスタンスが実装を指していることを認識します。