当前位置: 首页 > 面试题库 >

关于可复制的getObjectCopy(),如何证明未经检查的强制转换为什么可行

方绪
2023-03-14
问题内容

我有一个名为的接口Copyable,该接口具有一个功能

Copyable getObjectCopy();

许多其他类都使用此方法。由于此函数始终返回a Copyable,因此将导致未经检查的强制转换。例:

@SuppressWarnings("unchecked")  //Copy of itself is the same type.
ValidateValue<L> vvo = (ValidateValue<O>)this_toCopy.getValidator().getObjectCopy();
vvBlkA = vvo;

我的问题与乔什·布洛赫(Josh Bloch)的建议有关(《有效的Java》,第二版,第24项):

每次使用@SuppressWarnings(“ unchecked”)批注时,都添加一条注释,说明这样做安全的原因。

他的例子是

// This cast is correct because the array we're creating
// is of the same type as the one passed in, which is T[].
@SuppressWarnings("unchecked")
T[] result = (T[]) Arrays.copyOf(elements, size, a.getClass());
return  result;

(请参阅第9/117页的底部:http://www.infoq.com/resource/articles/bloch-
effective-
java-2e/en/resources/Bloch_Ch05.pdf

我喜欢这个主意,并希望与 getObjectCopy()

@SuppressWarnings("unchecked")  //Copy of itself is the same type.
ValidateValue<L> vvo = (ValidateValue<O>)this_toCopy.getValidator().getObjectCopy();
vvBlkA = vvo;

我的评论似乎有些la脚,但我想不出更好的办法。那就是我的问题: 为什么这种未经检查的铸造是合理的
?什么是有意义的评论,实际上将对未来的开发人员有所帮助,这意味着比实际上“仅仅相信我”还重要。


问题答案:

我们现在处在Java 5+世界中!用户通用。

您可以将的签名更改为Copyable

interface Copyable<T extends Copyable> {
    T getObjectCopy();
}

现在,您的ValidateValue<L>价值将类似于:

puvlic class ValidateValue<L> implements Copyable<ValidateValue<L>> {
    ...
}

每个人(包括编译器)都会很高兴!



 类似资料:
  • 问题内容: 请帮忙,我在以下代码中收到以下消息: PuntoNota.java AdapterDatos: 该应用程序运行良好,但是我收到以下消息: 未经检查的强制转换:从’java.io.Serializable’到’java.util.ArrayList’更少…(Ctrl + F1)。 关于此代码:(ArrayList)getIntent()。getSerializableExtra(“ my

  • 我有一个有效的方法,但给我一个警告,有没有什么解决方案可以干净地删除它? > 在这个方法中,我调用以下方法:

  • 问题内容: 所以这工作: 但这不是: 总而言之,我得到了第一部分(拳击),但是我发现第二部分不起作用是非常不直观的。是否有特定的原因(除了String从Object继承而int不从Object继承)? 编辑: 为了完善我的问题,这也可以: 但是,以下内容却没有: 令人惊讶的是,您遇到了与String相同的问题: 在最后一行产生类强制转换异常。仍然有效: 问题答案: 我刚刚找到了我正在寻找自己的答案

  • 明确的强制转换 明确的 强制转换指的是明显且明确的类型转换。对于大多数开发者来说,有很多类型转换的用法可以清楚地归类于这种 明确的 强制转换。 我们在这里的目标是,在我们的代码中指明一些模式,在这些模式中我们可以清楚明白地将一个值从一种类型转换至另一种类型,以确保不给未来将读到这段代码的开发者留下任何坑。我们越明确,后来的人就越容易读懂我们的代码,也不必费太多的力气去理解我们的意图。 关于 明确的

  • 问题内容: 我有以下代码将nvarchar转换为整数: 但是,我无法控制参数@value,因此代码可能会失败。无论如何,在进行转换之前是否要检查是否可以进行转换? 问题答案: 好吧,在SQL Server 2012中,您可以使用新的TRY_CAST(),但在SQL Server 2008中,您应该能够使用ISNUMERIC(),然后包括对未通过该测试的值进行处理。

  • 问题内容: 我在一个新项目中将Swift样板代码用于Core Data。我的文件有一个定义的单一实体()和一个属性()。 我有一个看起来像这样的文件: 当我运行它时,它起作用: 我什至可以进入iOS模拟器正在使用的SQLite数据库,并确认已添加该行。 但是,当我运行与上面完全相同的代码,但使用而不是时,出现了与…行关联的错误消息,导致崩溃。如果我继续执行,则每次执行线程1时它都会到达并位于线程1