首页 > 解决方案 > 有没有一种方便的方法来明确地进行不安全的演员表?

问题描述

所以我们知道,Java 没有具体化的泛型。这意味着如果你这样做:

Object someObject;
Transporter<Person> transporter = (Transporter<Person>) someObject;

这会产生未经检查的警告,因为您现在面临集合中的某些对象实际上不是 type 的风险,如果来自公共 API 中的外部对象Person,这可能会令人讨厌。someObject

但更常见的是,至少根据我自己的经验,您绝对确定该集合仅包含给定的类型。

所以你最终会这样做:

Object someObject;
@SuppressWarnings("unchecked")
Transporter<Person> transporter = (Transporter<Person>) someObject;

当然,可以为您创建一个方便的功能。这是它的工作原理:

@SuppressWarnings("unchecked")
public static <T> T unsafeCast(Object object) {
    return (T) object;
}

然后你可以这样做:

Object someObject;
Transporter<Person> transporter = unsafeCast(someObject);

这显然更好看,但它是如此明显的修复,我认为每个人最终都会想出它。如果我查看像 Gradle 这样的源代码,我会找到一个内部便利的方法。我相信其他人都会有同样的情况。

我们已经在使用 Guava,似乎没有任何类似的东西。

问题是,是否有一个库可以解决这类问题,或者每个人最终都会在他们的代码库中实现相同的方法?

标签: javagenericsunchecked-cast

解决方案


不,没有比您在问题中已有的更简单的方法了。标准库没有提供方便隐藏警告抑制的方法。

这是设计使然。这样的强制转换是一种真正的风险,并且会延迟对编程错误的检测——它们会将编译器错误变成运行时异常。

因此,这种不安全的强制转换通常应该限制在每个应用程序中的几个地方,并且很少成为主要问题。大多数反序列化或模拟库等允许在用户代码中避免它们并将它们隐藏在其内部的某个位置(如果需要的话)。如果您经常需要它们,我认为您的设计存在一些缺陷。

正如您提到的在特定的模拟库中经常遇到这种情况,也许您可​​以在CodeReview上提问,看看是否有更好的方法来编写这些测试。


推荐阅读