gpt4 book ai didi

java - 为什么转换为通用子类型会产生警告?

转载 作者:行者123 更新时间:2023-12-02 05:01:33 26 4
gpt4 key购买 nike

我正在尝试对 Builder 类进行子类化,如 Subclassing a Java Builder class 中所述。 。

那里给出的解决方案非常简单。这是基类:

public class NutritionFacts {

private final int calories;

public static class Builder<T extends Builder> {

private int calories = 0;

public Builder() {}

public T calories(int val) {
calories = val;
return (T) this;
}

public NutritionFacts build() { return new NutritionFacts(this); }
}

protected NutritionFacts(Builder builder) {
calories = builder.calories;
}
}

和子类:

public class GMOFacts extends NutritionFacts {

private final boolean hasGMO;

public static class Builder extends NutritionFacts.Builder<Builder> {

private boolean hasGMO = false;

public Builder() {}

public Builder GMO(boolean val) {
hasGMO = val;
return this;
}

public GMOFacts build() { return new GMOFacts(this); }
}

protected GMOFacts(Builder builder) {
super(builder);
hasGMO = builder.hasGMO;
}
}

但是,NutritionFacts.Builder#calories(int) 中的 return (T) this; 会导致

NutritionFacts.java uses unchecked or unsafe operations

警告。

鉴于泛型,为什么此转换不安全?我知道 T extends Builder 并且 this 一个 Builder,那么为什么是来自 的强制转换this (Builder) 到 T (extends Builder) 不安全? Actor 阵容应该永远不会失败,对吧?

最佳答案

它很可能会失败。在

public T calories(int val) {
calories = val;
return (T) this;
}

您假设

中的 T
public static class Builder<T extends Builder> {

将始终绑定(bind)到子类的类型。例如

public static class Real extends Builder<Real>{}

Java 中没有办法强制类型参数与声明的类型本身相同。有人很可能拥有

public static class Fake extends Builder<Real> {}

在这种情况下

Builder<Real> fake = new Fake();
Real real = fake.calories(4);

将会失败,并出现 ClassCastException

如果您知道这种情况永远不会发生,请忽略该警告。强制转换是一个明确的断言,表明您知道自己在做什么。

关于java - 为什么转换为通用子类型会产生警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28240542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com