gpt4 book ai didi

java - 具有泛型类型的方法调用链(好奇地重复泛型模式)

转载 作者:行者123 更新时间:2023-11-29 07:32:30 24 4
gpt4 key购买 nike

我遇到了一个我不明白原因的编译错误。

我正在尝试创建一个扩展另一个构建器的构建器,所有构建器都使用通用类型。

问题是一些泛型方法的返回类型是父类,而不是子类,这让我无法链接任何子方法。

这是一个简单的例子:

public class BuilderParent {
public static class BuilderParentStatic<B extends BuilderParentStatic<B>> {
public BuilderParentStatic() {}
public B withParentId(int rank) { return self(); }
protected B self() { return (B)this; }
}
}

public class BuilderChild extends BuilderParent {
public static class BuilderChildStatic<B extends BuilderChildStatic<B>>
extends BuilderParent.BuilderParentStatic<B> {
public BuilderChildStatic() {}
public B withChildStuff(String s) { return (B)this.self(); }
protected B self() { return (B)this; }
}
}

public class Test {
public static void main(String args[]) {
BuilderChild.BuilderChildStatic builder = new BuilderChild.BuilderChildStatic();

// OK (uses child first, then parent):
builder.withChildStuff("childStuff").withParentId(1);

// compile error (uses parent first, then child):
builder.withParentId(1).withChildStuff("childStuff");
}
}

为什么会出现编译错误?我怎样才能让它按预期工作?


编辑:

由于下面的答案,我使用以下 2 个更改设法解决了这个问题

1- 我将 BuilderChildStatic 类泛型更改为没有(奇怪的重复泛型模式)东西的普通有界泛型,

所以会变成下面这样:

    public static class BuilderChildStatic<B extends BuilderChildStatic> extends BuilderParent.BuilderParentStatic<BuilderChildStatic<B>> {

2- 另一个变化是我在 main 方法的声明中避免了原始类型,因为现在我可以在声明时指定类型

        BuilderChild.BuilderChildStatic<BuilderChild.BuilderChildStatic> builder = new BuilderChild.BuilderChildStatic<>();

问题中除了那 2 点之外的所有其他内容都保持不变

这样它的行为符合我的预期。

感谢您的精彩回答和解释

最佳答案

此答案适用于原始问题,不适用于没有重复出现的通用边界的更新问题。

使用原始类型会导致问题。您可以通过添加通用通配符约束来“修复”它,即:

 BuilderChild.BuilderChildStatic<?> builder = new BuilderChild.BuilderChildStatic();
builder.withChildStuff("childStuff").withParentId(1); //works since we used child first then parent
builder.withParentId(1).withChildStuff("childStuff"); //now works

这样,您返回的值将是 BuilderChildStatic 类型。

关于java - 具有泛型类型的方法调用链(好奇地重复泛型模式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40048180/

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