如何指定抽象方法的 return 类型 class
How to specify the return type of the method of an abstract class
我发现了很多关于该主题的 post,但无法找到我正在寻找的解决方案。
所以这是交易:
我有第一个摘要 class 有两个子class:
public abstract class A {
public A(args){..}
}
public class B extends A {
public B(args){
super(args);
}
}
public class C extends A{
public C(args){
super(args);
}
}
args 是一些变量,但形式不变。
classes 中还有一些其他内容,但在这里并不重要。
现在,我有另一个抽象 class,其中有两个子classes,它们是 B 和 C 的构建器。大部分构建器是相同的,所以我希望它在抽象生成器中
public abstract class Builder {
public A build(*?*){
//compute args
return new *either B or C*(args);
}
}
public class B_Builder extends Builder {
public B build(*?*){
super(*?*);
}
}
public class C_Builder extends Builder{
public C build(*?*){
super(*?*);
}
}
再次重申,构建器中的其他内容并不重要。
我的问题是如何通过构建器子class 告诉构建器抽象class return 构建类型应该是什么。
知道 return 类型 B 和 C 都扩展了 A。
我想我应该使用一些通用的东西,但我无法让它工作。
谁能帮帮我?
非常感谢!
LD
是的,你已经足够接近了,通用是要走的路:
A:
public abstract class A <T extends A<?>>{
public abstract T getObject(Object args);
}
B:
public class B extends A<B>{
@Override
public B getObject(Object args) {
// TODO Auto-generated method stub
return null;
}
}
C:
public class C extends A<C>{
@Override
public C getObject(Object args) {
// TODO Auto-generated method stub
return null;
}
}
您可以使用泛型类型参数和抽象创建者方法来完成构建,而抽象 class 则负责繁重的工作:
public abstract class Builder<T extends A> {
public T build(*?*){
//compute args
return create(args);
}
protected abstract T create(args);
}
public class B_Builder extends Builder<B> {
@Override
protected B create(args) {
return new B(args);
}
}
public class C_Builder extends Builder<C>{
@Override
protected C create(args) {
return new C(args);
}
}
您只能使用一个构建方法,如下所示:
public class BuilderA {
public static <T extends A> T of(Class<T> type, Object arg) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Constructor<T> constructor = type.getConstructor(arg.getClass());
return constructor.newInstance(arg);
}
}
此方法使用反射来构建具有指定类型的实例。它假设在 类 A、B 和 C 的构造函数中使用了相同类型的参数。下面是一个调用的样子:
A a1 = BuilderA.of(B.class, 1);
A a2 = BuilderA.of(C.class, 2);
B b = BuilderA.of(B.class, 2);
C c = BuilderA.of(C.class, 2);
在上面的调用中,所有的 类 都有一个 Integer 类型的构造函数。如果你有多个参数,你可以使用可变参数作为最后一个参数并检索可变参数的 类 并使用它们来检索正确的构造函数。
向超级 class 生成器添加模板参数。
class Builder<T> {
T build() {}
}
然后当你扩展时使用像
这样的东西
class ABuilder extends Builder<A> {
A build() {}
}
class BBuilder extends Builder<B> {
B build() {}
}
中包含工作示例的完整代码
我建议将相同的部分放在一个方法中,B和C的创建代码应该在子构建器中。
public abstract class Builder<T> {
public abstract T create(args);
public void build(args){
//do something here
return create(args);
}
}
public class BBuilder extends Builder<B> {
@Override
public B create(int args) {
return new B(args);
}
}
我发现了很多关于该主题的 post,但无法找到我正在寻找的解决方案。
所以这是交易:
我有第一个摘要 class 有两个子class:
public abstract class A {
public A(args){..}
}
public class B extends A {
public B(args){
super(args);
}
}
public class C extends A{
public C(args){
super(args);
}
}
args 是一些变量,但形式不变。 classes 中还有一些其他内容,但在这里并不重要。
现在,我有另一个抽象 class,其中有两个子classes,它们是 B 和 C 的构建器。大部分构建器是相同的,所以我希望它在抽象生成器中
public abstract class Builder {
public A build(*?*){
//compute args
return new *either B or C*(args);
}
}
public class B_Builder extends Builder {
public B build(*?*){
super(*?*);
}
}
public class C_Builder extends Builder{
public C build(*?*){
super(*?*);
}
}
再次重申,构建器中的其他内容并不重要。
我的问题是如何通过构建器子class 告诉构建器抽象class return 构建类型应该是什么。 知道 return 类型 B 和 C 都扩展了 A。 我想我应该使用一些通用的东西,但我无法让它工作。
谁能帮帮我?
非常感谢!
LD
是的,你已经足够接近了,通用是要走的路:
A:
public abstract class A <T extends A<?>>{
public abstract T getObject(Object args);
}
B:
public class B extends A<B>{
@Override
public B getObject(Object args) {
// TODO Auto-generated method stub
return null;
}
}
C:
public class C extends A<C>{
@Override
public C getObject(Object args) {
// TODO Auto-generated method stub
return null;
}
}
您可以使用泛型类型参数和抽象创建者方法来完成构建,而抽象 class 则负责繁重的工作:
public abstract class Builder<T extends A> {
public T build(*?*){
//compute args
return create(args);
}
protected abstract T create(args);
}
public class B_Builder extends Builder<B> {
@Override
protected B create(args) {
return new B(args);
}
}
public class C_Builder extends Builder<C>{
@Override
protected C create(args) {
return new C(args);
}
}
您只能使用一个构建方法,如下所示:
public class BuilderA {
public static <T extends A> T of(Class<T> type, Object arg) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Constructor<T> constructor = type.getConstructor(arg.getClass());
return constructor.newInstance(arg);
}
}
此方法使用反射来构建具有指定类型的实例。它假设在 类 A、B 和 C 的构造函数中使用了相同类型的参数。下面是一个调用的样子:
A a1 = BuilderA.of(B.class, 1);
A a2 = BuilderA.of(C.class, 2);
B b = BuilderA.of(B.class, 2);
C c = BuilderA.of(C.class, 2);
在上面的调用中,所有的 类 都有一个 Integer 类型的构造函数。如果你有多个参数,你可以使用可变参数作为最后一个参数并检索可变参数的 类 并使用它们来检索正确的构造函数。
向超级 class 生成器添加模板参数。
class Builder<T> {
T build() {}
}
然后当你扩展时使用像
这样的东西 class ABuilder extends Builder<A> {
A build() {}
}
class BBuilder extends Builder<B> {
B build() {}
}
中包含工作示例的完整代码
我建议将相同的部分放在一个方法中,B和C的创建代码应该在子构建器中。
public abstract class Builder<T> {
public abstract T create(args);
public void build(args){
//do something here
return create(args);
}
}
public class BBuilder extends Builder<B> {
@Override
public B create(int args) {
return new B(args);
}
}