13

いくつかのコードを見ると、次のコードに出くわしました

trTuDocPackTypdBd.update(TrTuDocPackTypeDto.class.cast(packDto));

この方法でキャストすることに利点があるかどうかを知りたいです

trTuDocPackTypdBd.update((TrTuDocPackTypeDto)packDto);

担当の開発者に尋ねたところ、彼はそれが新しいので使用したと言いました (これは特に正当な理由ではないように思えます) が、いつこのメソッドを使用したいか興味をそそられます。

4

5 に答える 5

21

これらのステートメントは同一ではありません。キャスト メソッドは通常のメソッド呼び出し ( invokevirtualJVM 命令) であり、もう 1 つは言語構造 (checkcast命令) です。上記の場合、2 番目の形式を使用する必要があります。(TrTuDocPackTypeDto) packDto

このcastメソッドは、変数型の Class インスタンスがある場合に、ジェネリックを使用したリフレクション プログラミングで使用されます。次のように使用できます。

public <T> Set<T> find(Class<T> clz, Filter criteria) {
  List<?> raw = session.find(clz, criteria); /* A legacy, un-generic API. */
  Set<T> safe = new HashSet<T>();
  for (Object o : raw) 
    safe.add(clz.cast(o));
  return safe;
}

これにより、生の型をジェネリック型に単純にキャストするという誤った代替手段を回避する安全な方法が得られます。

/* DO NOT DO THIS! */
List raw = new ArrayList();
...
return (List<Widget>) raw;

コンパイラは警告を表示します。Unchecked cast from List to List<Widget>つまり、省略記号では、誰かが生のリストに a を追加した可能性があり、呼び出し元が返された (想定される)インスタンスのリストを反復処理するGadgetと、最終的に a が発生します。ClassCastExceptionWidget

于 2008-10-28T16:05:45.773 に答える
4

それを行う主なケース (IME) は、ジェネリック クラス/メソッドで安全にキャストする必要がある場合です。型消去のため、にキャストすることはできませんTが、パラメーターが提供されている場合は、Class<? extends T>それを使用してキャストでき、結果は type の変数に代入できますT

于 2008-10-28T15:57:50.937 に答える
0

最初のフォームで

trTuDocPackTypdBd.update(TrTuDocPackTypeDto.class.cast(packDto));

あなたはこれを行うことができます:

public void dynamicCast( Class clazz, Object o ) { 
     this.x = clazz.cast( o );
}

2番目ではできません。キャストクラスはハードコーディングする必要があります。

そもそもなぜ変数を使ってキャストするのですか?それは別の質問です。:)最初に頭に浮かぶのは、(コンパイル時に)キャスト先のクラスがわからないということです。

于 2009-03-13T17:15:25.840 に答える
0

キャストメソッドが可能で、キャスト構文が不可能な例が見つかりません。ただし、コードを見ると、キャストが不可能な場合、キャストメソッドは型情報を添付せずに ClassCastException をスローするように見えますが、キャスト構文はいくつかのヒントを提供します (「スヌーピーを TyrannosorusRex にキャストできませんでした」など)。 ") :

/**
 * Casts an object to the class or interface represented
 * by this <tt>Class</tt> object.
 *
 * @param obj the object to be cast
 * @return the object after casting, or null if obj is null
 *
 * @throws ClassCastException if the object is not
 * null and is not assignable to the type T.
 *
 * @since 1.5
 */
public T cast(Object obj) {
if (obj != null && !isInstance(obj))
    throw new ClassCastException();
return (T) obj;
}
于 2009-03-13T16:58:15.880 に答える
-3

これらのステートメントはどちらも同じです。読みやすい方を選んでください。2 番目の方法は、私の経験ではより一般的であり、私が好む方法です。

私は、リフレクションを使用している場合にのみキャスト メソッドを使用する傾向があり、その状況では読みやすくなります。それ以外の場合は、2 番目のキャスト方法を使用していることに気づきます。

于 2008-10-28T15:54:29.307 に答える