cuốn sách gpt4 ai đã làm

java - 安全转换 扩展到

In lại Tác giả: Walker 123 更新时间:2023-11-29 04:09:10 25 4
mua khóa gpt4 Nike

我有一个 HTTP 执行器类:

Future future = service.apply(request).toJavaFuture();

现在我想删除 ? extends其中的一部分,因为我不想让它对调用者如此通用。基本上,我想返回 Future .

从我的角度来看:

x extends y

表示 xĐúngy , 和 yKHÔNG x .

这意味着 x可以转换为 y .

在我看来,这可以安全地完成,因为x总是延伸y .

为什么以下内容不安全?


Future future = service.apply(request).toJavaFuture();

Future futureResponse = (Future) future;

câu trả lời hay nhất

我想说这是编译器对泛型类型参数的限制。编译器知道您正在参数化该类,但它不知道如何使用它。

của bạn Future是数据持有者。您不能将任何内容放入其中,只能从中获取请求。在这种情况下,您的期望是 FutureFuture将以相同的方式运行,因此可以安全地进行转换,这是完全合理的。这两个东西都是请求的提供者。确切的实例可能是子类,但无论我们从 Future 中得到什么肯定会实现Request的方法, 所以这个类型转换看起来应该是安全的。

当您的类不是纯粹的供应商,而是它们正在使用数据时,问题就来了。假设我们向 Future 添加了一个方法设置值:

interface Future
{
void setValue(T value);
//...
}

我们有一个 Future它被创建为 Future .当我们类型转换它时 Future , 我们现在可以调用 setValueResponse ,而在类型转换之前我们需要一个 ChildResponse .这就是 Actor 阵容不安全的原因。

实际上,编译器不够聪明,无法区分这两种情况,因此最好的决定是始终将转换声明为不安全的。即使编译器可以区分,但接口(interface)可能会更改这一事实使问题变得更加复杂 - 假设 Future如上所述进行了更改 - 因此以前安全的类型转换将不再安全。

在这种情况下,我个人觉得抑制警告没有问题。转换就是向编译器断言您拥有它没有的信息,这就是您所处的情况。

关于java - 安全转换 扩展到 ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56130764/

25 4 0
Walker 123
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress