gpt4 book ai didi

java - 自引用泛型并取回您自己的实例

转载 作者:搜寻专家 更新时间:2023-11-01 02:57:12 31 4
gpt4 key购买 nike

我有一个位置和一个处理位置的处理器。给定一个位置,客户端可以请求该位置的处理器。我实现了 Location如下:

public abstract class Location<SELF extends Location<SELF>> {
...

public Processor<SELF> processor() {
return new Processor(this);
}
}

我正在创建和使用来自 Location 的子类, 从不 Location直接:

public class SecretLocation extends Location<SecretLocation> {
...
}

我需要处理器上的类型安全,所以只能提供属于这个具体 secret 位置类实例的引用(此处省略),因此使用 SELF和子类,并提供类型化的 Location到处理器。

现在,我想实现 Processor如下:

public class Processor<L extends Location<L>> {
private final L location;

public Processor(L location) {
this.location = location;
}

public L location() {
return location;
}

...
}

但是有了这个实现,new Processor(this)Location是无效的。我找到了两种方法来解决这个问题,但我不确定哪种方法最好:

  • 执行 new Processor(this)而不是 new Processor<>(this)Location ,所以基本上禁用泛型。

  • 接受 Location<L>而不是 LProcessor 中的构造函数和成员变量中.结果是 setter/getter locationProcessor现在必须返回 Location<L>而不是 L如上。缺点是processor.location()现在永远不会返回 SecretLocation不再,在 SecretLocation 上创建处理器时,而是一个 Location<SecretLocation> .这有点草率,因为现在我永远无法获得 SecretLocation通过处理器返回。

作为引用,这是我的第二个解决方案:

public class Processor<L extends Location<L>> {
private final Location<L> location;

public Processor(Location<L> location) {
this.location = location;
}

public Location<L> location() {
return location;
}

...
}

有什么更好的办法吗?

最佳答案

在这种情况下,最直接的解决方案可能是这样的:

public abstract class Location<SELF extends Location<SELF>> {
...

public Processor<SELF> processor() {
return new Processor<>( self() );
}

protected abstract SELF self();
}

public class SecretLocation extends Location<SecretLocation> {
...

@Override
protected SecretLocation self() { return this; }
}

问题是给定的边界实际上并没有将类型参数限制为 this 的类型,例如以下类将编译:

class BadLocation extends Location<SecretLocation> {}

另一种解决方案是使用未经检查的转换:

return new Processor<>((SELF) this);

这也可以,但如 BadLocation 所示,没有真正限制 this 实际上是 SELF 的对象。 (但是,对于 abstract 方法解决方案,没有子类必须从方法返回 this 的限制,因此在保证正确性方面,这两种解决方案都不是完美的。)

关于java - 自引用泛型并取回您自己的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52653005/

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