gpt4 book ai didi

扩展或者是父类的 Java 泛型类型

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

我正在寻找一些如下所示的代码:

public class Parent<T is_or_extends Parent<T>> {
public T function() {
// do some stuff //
return correct();
}
public T correct() {
return (T) this;
}
}

这样一来,任何子类都可以访问其他父函数,但仍将保持独立的类(无需将 function() 的返回值向上转换为 Parent 的实例)。并且程序员也可以独立使用 Parent 类(因此可以创建 Parent 的实例而无需 function() 向下转换返回对象)

实现:

public class Child extends Parent<Child> {}

用法:

Child child = new Child(); // ok
Parent<Child> polymorph = new Child(); // ok
Parent<Parent> parent = new Parent<Parent>(); // ERROR!

只是为了概述一个区别,这不是方法链的问题。相反,当父类接受子类的泛型时,它不能再单独用作类(使用上面的代码),因为 new Parent<Parent>()不会编译(当用“is_or_extends”替换“extends”时)

我的目标:

我的目标是实现一个父类,当扩展时,function()将返回子类的对象而不是父类。

我会使用泛型类型来告诉父类哪个子类调用了函数,但我不能再使用父类本身的对象而不会遇到异常。示例如下:

public static class Parent<T extends Parent<T>> {}
public static class Child extends Parent<Child> {}

public static void main(String[] args) {
// This will not compile as Parent cannot extend Parent
Parent<Parent> parent = new Parent<Parent>();

// This will work as Child extends Parent
Child child = new Child();
}

提前致谢。

最佳答案

extends does 意思是“是或延伸”。您的示例无法编译的原因是内部 Parent是原始类型,不能有效替代 T extends Parent<T> . “正确”的类型应该是这样的:Parent<Parent<Parent<...>>>无穷无尽。显然这样的类型是不可能声明的。

一种解决方案是像这样实例化它:

Parent<?> parent = new Parent<>();
Parent<?> derived = parent.function();

这是可行的,因为编译器已经知道 TParent<?> 的某个子类.这个技巧的一个缺点是,如果无法推断类型,例如在使用匿名类时,它就不会起作用。

另一种可能的方法 - 取决于父/子关系的性质 - 是创建一个额外的类来扩展基类,只是为了它的类型解析:

// Parent functionality in here
public static abstract class Base<T extends Base<T>> {}

// This can be empty, or have just constructors if necessary
public static class Simple extends Base<Parent> {}

// Child functionality in here
public static class Extended extends Base<Extended> {}

关于扩展或者是父类的 Java 泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39133947/

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