类型变量可以引用当前类型吗?
假设您要创建一个返回当前类型实例的函数。有没有办法确保 T 专门指代子类型(例如,T 应该指代 B 类中的 B)?
实施解决方案
扩展 StriplingWarrior 的响应,以下模式对于实现这一点至关重要(分层流畅构建器的配方API):
解决方案
定义基本抽象类或接口:
建立一个用于获取扩展实例的运行时类型的合约class:
abstract class SelfTyped<SELF extends SelfTyped<SELF>> { abstract SELF self(); }
创建中间抽象类:
中间类维护递归类型参数SELF。它们应该是抽象的,以防止直接使用:
public abstract class MyBaseClass<SELF extends MyBaseClass<SELF>> extends SelfTyped<SELF> {...}
定义叶类:
最终的类用它们的解析 SELF 类型参数自己的类型。为了安全起见,将它们定为最终版本:
public final class MyLeafClass extends MyBaseClass<MyLeafClass> {...}
用法示例:
MyLeafClass mlc = new MyLeafClass().baseMethod().leafMethod(); AnotherLeafClass alc = new AnotherLeafClass().baseMethod().anotherLeafMethod();
警告和结论
此模式是“奇怪的重复模板”的实现爪哇。虽然功能强大,但需要谨慎使用,并且最好仅保留用于内部 API。该模式本质上是不安全的,必须谨慎使用以避免误用。然而,如果有效使用,它可以增强构建器 API 的表现力和可用性。
以上是Java 中类型变量可以引用它们的定义类吗?的详细内容。更多信息请关注PHP中文网其他相关文章!