2

以下はコードスニペットです。

public class Operand<T> {

    private OperandStore store;

    private final int operandType, operandId;

    public Operand( int operandType, int operandId, OperandStore store ) {
        this.operandId = operandId;
        this.operandType = operandType;
        this.store = store;
    }

    @SuppressWarnings( "unchecked" )
    public T evaluate() {
        try {
            return ( T ) store.getValue( operandType, operandId );
        }
        catch ( Exception e ) {
            return null;
        }
    }
}

私のgetValue方法:

public Object getValue(int  operandType, int operandId ) {
      // return some value from a <String, Object> hashmap based on some condition
  }

上記のクラスのオブジェクトを作成すると、次のようになります。

Operand<Integer> obj = new Operand<>(1,1,store);

store.getValue( operandType, operandId )...そしてそれが文字列を返すことを確認してくださいtry。ブロックで発生していないエラーが発生することを期待しています。string代わりに値を返しています。

何らかの理由?親切に説明してください。ありがとう。

4

2 に答える 2

3

を削除@SuppressWarnings( "unchecked" )し、警告を読みます。

「Unchecked cast: 'java.lang.Object' to T」と表示されます。

チェックされていないキャストとは、「オブジェクトが T のインスタンスであることをキャストがチェックしない」ことを意味します。

したがって、これは機能しないとコンパイラから警告されましたが、警告を無視しました。型消去のため機能しません。

于 2013-08-19T11:02:15.667 に答える
3

単に呼び出しますobj.evaluate()か、それとも次のようなものを呼び出しますかInteger x = obj.evaluate()

例えば:

OperandStore store = new OperandStore();
Operand<Integer> obj = new Operand<>(1,1,store);
Integer x = obj.evaluate();

ClassCastExceptionこれは、Java が問題を認識する場所であるため、 で失敗します。

それ以前は、タイプ eraserによる失敗はありません。基本的に、実行時の T の型は単純に java.lang.Object です。そのため、T へのキャストは機能しているように見えますが、呼び出しサイトで T を使用しようとすると、Java が実行しようとすると例外が発生します。合成鋳造。

于 2013-08-19T10:59:54.770 に答える