11

プリミティブ型の問題を見つけました

System.out.println("Integer.class.isAssignableFrom(int.class) = " + Integer.class.isAssignableFrom(int.class));
System.out.println("int.class.isAssignableFrom(Integer.class) = "+int.class.isAssignableFrom(Integer.class));

どちらのステートメントも呼び出し元に false を返します。ボクシングはここでは当てはまらないようです。私の質問は、私の観察が正しいかどうか、またはこのテストを正しく実行できる他の A​​PI があるかどうかです。

- - - - - - - - - - - - - - - - フォローアップ - - - - - - - - ------------------------------

私が言ったように、私は主に、リフレクションを使用するときにオブジェクトがフィールドに割り当て可能かどうかを確認したいと考えています。実行時にメカニズムがより正確になることを願っているので、このような実装を行いました。

    public static boolean isAssignableFrom(final Field field, final Object obj) {


        if (field.getType().equals(Integer.class) || field.getType().equals(int.class)) {
            return obj.getClass().equals(Integer.class) || field.getType().equals(int.class);
        } else if (field.getType().equals(Float.class) || field.getType().equals(float.class)) {
            return obj.getClass().equals(Float.class) || field.getType().equals(float.class);
        } else if (field.getType().equals(Double.class) || field.getType().equals(double.class)) {
            return obj.getClass().equals(Double.class) || field.getType().equals(double.class);
        } else if (field.getType().equals(Character.class) || field.getType().equals(char.class)) {
            return obj.getClass().equals(Character.class) || field.getType().equals(char.class);
        } else if (field.getType().equals(Long.class) || field.getType().equals(long.class)) {
            return obj.getClass().equals(Long.class) || field.getType().equals(long.class);
        } else if (field.getType().equals(Short.class) || field.getType().equals(short.class)) {
            return obj.getClass().equals(Short.class) || field.getType().equals(short.class);
        } else if (field.getType().equals(Boolean.class) || field.getType().equals(boolean.class)) {
            return obj.getClass().equals(Boolean.class) || field.getType().equals(boolean.class);
        } else if (field.getType().equals(Byte.class) || field.getType().equals(byte.class)) {
            return obj.getClass().equals(Byte.class) || field.getType().equals(byte.class);
        }
        return field.getType().isAssignableFrom(obj.getClass());
    }

}

それが私にできる最善のことのようです-_-!ありがとう

4

4 に答える 4

6

int.classInteger.classは 2 つの別個のクラス オブジェクトです。this詳細については、回答を確認してください

Java ドキュメントからClass#isAssignableFrom

この Class オブジェクトによって表されるクラスまたはインターフェースが、指定された Class パラメーターによって表されるクラスまたはインターフェースと同じであるか、そのスーパークラスまたはスーパーインターフェースであるかを判断します。その場合は true を返します。それ以外の場合は false を返します。この Class オブジェクトがプリミティブ型を表す場合、指定された Class パラメータがまさにこの Class オブジェクトであれば、このメソッドは true を返します。それ以外の場合は false を返します。

于 2013-01-04T06:05:31.433 に答える
3

ドキュメントからisAssignableFrom

このメソッドは、指定された Class パラメータによって表される型が、恒等変換または拡大参照変換によって、この Class オブジェクトによって表される型に変換できるかどうかをテストします。詳細については、Java 言語仕様のセクション 5.1.1 および 5.1.4 を参照してください。

Integerこの方法で を (またはその逆に)に割り当てることはできないintため、メソッドは false を返します - ボックス化とボックス化解除は実行時ではなくコンパイル時に行われます - 詳細については、この記事を参照してください

于 2013-01-04T06:06:43.643 に答える