0

私はこれが可能であることを知っていますが、何の用途がありますか? キャストされるオブジェクトと同じ型しかキャストできないので?

class Example<X>{ 
//statements
}

//then this is declared
Example<Integer> x = new Example<Integer>();

//This is allowed
(Example<Integer>) x;

//this is not allowed, so what's the use?
(Example<Long>) x;
4

3 に答える 3

3

私は最初のものにいくらかの使用を見ます。Java は実行時に型を決定するため、この特定のケースでは、x をオブジェクトのインスタンスのように宣言し、その行でそれをダウンキャストすることで、x が実際に Example であることをコンパイラに伝えます。

Long は Integer のサブクラスではなく、どちらも Number を継承していると思うので、兄弟のようなものであるため、2 番目の例は許可されていないと思います。

ドキュメントを確認してください: 整数

したがって、次のようなことをしたとします。

Example<Number> x = new Example<Number>();

(Example<Integer>) x;
(Example<Long>) x;

そして、x をビジターのようなものにオーバーロードしてドロップすると、x はExample<Long>実装ではなく実装内に落ちてしまいますExample<Integer>

少し混乱したと思いますが、役に立てば幸いです。

于 2012-12-27T16:42:45.783 に答える
0

本の引用は、あなたが例によって表現するとは言っていません。この本によると、型引数が同じである限り、通常のキャスト規則を単純に適用できます。

于 2012-12-27T16:52:25.357 に答える
0

それで何の役に立つの?

用途はたくさんあります。

たとえば、ワイルドカード パラメーターを特定のパラメーター、またはより具体的なワイルドカード パラメーターにキャストするには、次のようにします。

Example<?> x;
Example<? extends Number> y;
Example<Integer> z;
y = (Example<? extends Number>)x;
z = (Example<Integer>)x;
z = (Example<Integer>)y;

または、実際のクラスをより具体的なクラスにキャストする場合:

Example<Integer> x;
SubExample<Integer> y;
y = (SubExample<Integer>)x;
于 2012-12-27T19:56:51.943 に答える