12

最近、JVM にはプリミティブ型のクラス表現があることを知りました。たとえば、、、int.classさらにdouble.classvoid.class.

私が理解していないのは、なぜこれらがそこにあるのかということです。それらは機能的な役割を果たしていないようです。リフレクションを使用してクラスを検索したところ、コンストラクターもメソッドもフィールドもありませんでした。すべての意図と目的のために、それらは空っぽで役に立たないように見えます。プリミティブ型変数は、次のように false を返すことで示されるように、それぞれのクラスのインスタンスではありません。

int a = 3;
int.class.isInstance(a);

では、なぜそれらは存在するのでしょうか? おそらくコンパイラか何かのために、何らかの目的を果たさなければなりませんが、それが何であれ、私には完全に理解できません。Integer APIint.classにはへの明示的な参照もあります(各プリミティブ型とそれぞれのラッパー オブジェクトについても同様です)。JLS では、それらの存在、ましてやその使用についての言及を見つけることができませんでした。

4

2 に答える 2

12

私が理解していないのは、なぜこれらがそこにあるのかということです。

次の点を考慮してください。

public int foo() {
    return 0;
}

...

Method method = someClass.getDeclaredMethod("foo");
Class<?> clazz = method.getReturnType();

Classの表現がなければint、上記は何を返すでしょうか? それらは同じものではないため、返さInteger.classれるべきではありません。(オーバーロードされたメソッドを区別しようとすることを想像してみてください。1 つは で、もう 1 つはパラメータです。)intInteger

これらのクラスを使用して、リフレクションを介して引数を呼び出すときに引数のデフォルト値を提供したことがあります。パラメータの型に基づいて、nullすべての参照型に使用し、プリミティブ型ごとにいくつかの (ボックス化された、明らかに) プリミティブ値を使用しました。

于 2012-11-02T14:24:30.893 に答える
2

それは悪いことが判明した安価なお尻のソリューションです.

1.5 より前の Java 型は、次のように分類できます。

java type
    primitive type
    reference type
        class type (including interface)
        array type

次に、理想的には、Java リフレクションは、これらの 5 つのタイプを反映する 5 つの概念を提供する必要があります。Classしかし、プリミティブ型や配列型を含め、それらすべてを表すために単一を使用しました。したがって、aClassは必ずしもクラスを意味するわけではありません。

それはまだ管理可能です。しかし 1.5 以降、Java の型はより複雑になるため、新しいTypeが導入されました。残念ながら、言語仕様を直接反映する新しくてきれいな階層を持つ代わりに、彼らは;Classのサブタイプを作成することにしました。Type古い混乱が持ち込まれるだけでなく、新しい混乱が生まれ、Typeヒエラルキー全体が理解できなくなります。

于 2012-11-02T15:14:51.200 に答える