【问题标题】:how can I return a subclass reference from superclass method如何从超类方法返回子类引用
【发布时间】:2014-05-20 13:58:20
【问题描述】:

我有一个返回自身的超类方法(用于构建器模式)。这个类有几个子类,所以我想返回一个对对象的实际(子类)类型的引用。像这样的:

class SuperClass {
   T someMethodThatDoesSameThingForAllSubclasses() {

    // blablbal
    return reference_of_actual_object;

  }

}

这样我就可以从子类引用中调用其他子类方法而无需强制转换。像这样:

SubClass obj=new SubClass(); 
obj.someMethodThatDoesSameThingForAllSubclasses().someSubclassMethod();
//currently this gives compiler error.  because first method returns superclass reference and super class doesn't have     someSubclassMethod

这可行吗?尝试做这样的事情是否有意义?

【问题讨论】:

    标签: java inheritance builder-pattern


    【解决方案1】:

    据我所知,没有特别好的方法可以做到这一点。我见过的最好的就是投射——当然,你可以做一次:

    public class Superclass<T extends Superclass<T>> {
        @SuppressWarnings("unchecked")
        private final T thisAsT = (T) this;
    
        T someMethodThatDoesSameThingForAllSubclasses() {
           return thisAsT;
        }
    }
    
    public class Subclass extends Superclass<Subclass> {
        Subclass subclassOnlyMethod() {
            return this;
        }
    }
    

    然后:

    Subclass subclass = new Subclass().someMethodThatDoesSameThingForAllSubclasses()
                                      .subclassOnlyMethod();
    

    由于类型擦除,演员没有实际上检查任何东西,这太可怕了,但这就是 Java 泛型的乐趣:(

    【讨论】:

    • 这样我不能调用子类方法。编译错误仍然存​​在。另外,内部自定义异常类也存在问题。这种方式编译器不会让从 Throwable 继承。
    • @user3354638:你之前没有提到异常——但是子类应该没问题,只要你给它正确的T。我会举一个例子。
    • 我向所有子类添加了调用者 'caster' 方法。这很可怕,但现在可以完成这项工作。
    • @user3354638:但是为什么呢?我给出的代码做同样的事情,但一次完成。你的意思是你在超类中有一个 abstract caster 方法,然后你在每个子类中实现它?虽然这消除了可能无效的演员阵容,但我认为它没有任何实际好处。
    • 顺便说一下,这是 SQL 构建器类。超类是Sql,子类是Select,Update等。方法是'where'。它返回对 Sql 的引用,这会使构建器模式失败。
    猜你喜欢
    • 2018-05-09
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多