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

你是简单地调用obj.evaluate()还是调用类似的东西Integer x = obj.evaluate()

例如:

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

这将失败ClassCastException,因为它是 Java 意识到问题的地方。

在此之前,它不会因类型擦除而失败。基本上,运行时 T 的类型只是 java.lang.Object,这就是为什么将任何东西转换为 T 似乎有效的原因,但是一旦您尝试在调用站点中使用 T,当 Java 尝试这样做时,您会得到异常合成铸件。

于 2013-08-19T10:59:54.770 回答
3

删除@SuppressWarnings( "unchecked" ),并阅读警告。

它告诉你“未经检查的演员表:'java.lang.Object' to T”。

未经检查的强制转换意味着:“强制转换不会检查 Object 是 T 的实例。”。

因此,编译器已警告您这不起作用,但忽略了警告。由于类型擦除,它不起作用。

于 2013-08-19T11:02:15.667 回答