私はこのコードを実行し、出力はあなたが(クラスが異なる階層の枝に複数の共通の祖先を持っている、少なくとも場合)保証を持っていないよう指示
正直なところ、私はこの魔法の背後にある理由を知りません、しかし、私はちょうどコメント
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
interface A{}
interface B{}
class AB implements A, B {}
class BA implements A, B {}
public static void main (String[] args) throws java.lang.Exception
{
foo(new AB(), new BA());
foo2(new AB(), new BA());
}
static <T> void foo(T... arr) {
System.out.println(arr.getClass() == A[].class);
}
static <T> void foo2(T... arr) {
System.out.println(arr.getClass() == B[].class);
}
}
出力
true
false
として、それを投稿しませんでした
もっと奇妙なこと:
interface B
がinterface A
前に宣言されている場合、結果は逆です:
false
true
引数の順序を変更するインタフェースのメソッド呼び出し、メソッドの宣言の順序と順序でimplements
ブロックで行います私には効果がありません(1.8.0_51)。
ここでの答えは、「私が試したすべてのコンパイラには少なくともいくつかの不一致があります。 –
おそらく、http://docs.oracle.com/javase/specs/jls/se8/html/jls-18.html#jls-18.5.1とそれに続く。 – assylias