7

Apple が別の単純なクラス Fruit から拡張した単純なクラスがあります。

実行時に、私は使用できます

Fruit fruit = new Apple();

fruit.getClass();

Apple.class である果物オブジェクトの実際のタイプを取得します。

fruit instanceof Appleまた、 とを使用して、fruit instanceof Fruitこのフルーツ オブジェクトが Apple または Fruit のインスタンスであるかどうかを確認することもできます。これら 2 つの式はどちらも true を返しますが、これは正常です。

fruitしかし、宣言された識別子の型を正確に判断する方法はありますか? この場合はFruitです。

4

3 に答える 3

12

オブジェクトの実際のランタイムタイプ(この場合fruitは)ではなく、の変数宣言について実際に質問しています。Apple

これは一般的に悪い考えだと思います。変数を宣言し、それがであるとコンパイラーに伝えたのですがFruit、なぜ今これを見つける必要があるのでしょうか。

さらに混乱させるために、同じオブジェクト(まだApple)を参照する異なる宣言型の複数の変数を持つこともできることに注意してください。

Fruit fruit = new Apple(); // fruit declared as Fruit, but refers to an Apple
Object thing = fruit;      // thing declared as Object, refers to the same Apple

宣言されたタイプを本当に知りたい場合は、いくつかのオプションがあります。

  • インスタンスfruit変数を作成し、リフレクションを使用して宣言された型をクエリします。
  • ソースコードを処理して、変数宣言を見つけます
  • コンパイルされたバイトコードを処理して宣言タイプを見つけます(ただし、アグレッシブなコンパイラーがコンパイル時の宣言を完全に最適化する可能性もあります。たとえば、このコードではフルーツはAppleにしかなれません)。

これらはすべてかなり醜いと思うので、私の一般的なアドバイスは「やらないでください」です。

于 2012-07-07T12:54:21.070 に答える
3

いいえ、ありません。少なくとも反射を使用していません。リフレクションは、実行時のオブジェクト、フィールド、メソッド、クラスに関する情報を提供しますが、ローカル変数は提供しません。果物が畑だった場合、次のようなことができます。

FruitBasket.class.getDeclaredField("fruit").getType();
于 2012-07-07T13:00:59.737 に答える
3

オブジェクトにはFruit宣言されたタイプがありません。その型を持つのは変数です。 fruit渡すことができるのはFruitオブジェクトへの参照だけなので、あなたの要求はあまり意味がないと思います。オブジェクトが格納されている特定のインスタンス変数がある場合に、取得できる最善の方法があります。次に、そのフィールドを反映して、宣言されたタイプを。で取得できField.getType()ます。

于 2012-07-07T12:55:08.573 に答える