当前位置: 首页 > 知识库问答 >
问题:

从抽象父类中的方法返回具体子类的实例

赫连飞沉
2023-03-14

我在想有没有更好的办法。我想要的是在抽象类中有一个具体的方法,返回扩展抽象类的具体实例。

abstract class ParentClass<T extends ParentClass> extends RelativeLayout {
    ...
    public T aMethod(){
        return (T)this;
    }
}
class ChildClass1 extends ParentClass<ChildClass1>{
...
}

我认为我不应该把它转换成T,因为它总是T的一个实例。

共有1个答案

羊冠玉
2023-03-14

问题是没有办法引用“this very class”的类型。这就是为什么必须使用抽象类基 > 这样的构造。但正如许多人在评论中提到的,没有什么可以禁止您定义subclass1 extends 。刚才有一种语法方法可以保证t是“this very class”。

但是,您可以在运行库中强制执行此保证。您可以使用类似TypeTools或其他方法来提取使用的泛型类型,并确保当前实例具有该类型。这可能会导致如下结果:

public abstract class Base<T extends Base<T>> {

    protected Base() {
        final Class<?> t = (Class<?>) ((ParameterizedType) getClass().getGenericSuperclass())
                .getActualTypeArguments()[0];
        if (!t.isInstance(this)) {
            throw new IllegalArgumentException();
        }
    }

    public T getInstance() {
        @SuppressWarnings("unchecked")
        T thisIsT = (T) this;
        return thisIsT;
    }
}

可以实例化此类:

public class Extension1 extends Base<Extension1> {}

但这个不是:

public class Extension2 extends Base<Extension1> {}

base构造函数保证thist的实例,因此将this强制转换为t安全的。

 类似资料:
  • 我知道抽象类可能包含抽象和具体方法(即主体实现)。我的问题是:子类可以从抽象超类继承/覆盖具体方法吗?其次,它们必须以实现抽象方法的方式实现具体方法吗?

  • 问题内容: 从子类对象调用该方法时,是否有任何优雅的方法可以使位于父类中的Java方法返回子类的对象? 我想在不使用其他接口和方法的情况下实现此功能,并在没有类强制转换,辅助参数等的情况下使用此功能。 更新: 抱歉,我不太清楚。 我想实现方法链,但是父类的方法存在问题:调用父类方法时,我无法访问子类方法… 我想我已经提出了我的想法的核心。 因此,方法应返回类的对象。 问题答案: 如果您只是在寻找针

  • 我正在做一个绘图项目,我有一些工具(例如画笔、橡皮擦等),它们都是自己的类,每个都继承自一个抽象工具类,具有一些基本属性和抽象/非抽象方法。我看到的主要问题是,当我需要更改这些工具的颜色时,我想找出一种方法来为所有工具更改颜色,但也允许某些工具(如橡皮擦)保持不变,因为它的颜色应该始终只是背景色。 我正在从其他地方接收onColorChange(int newColor)方法调用,但这是触发工具颜

  • 问题内容: 当其中的所有方法都是具体的时,有人在声明类抽象时有一些实际的编程情况吗? 问题答案: 好吧,您可能正在使用模板方法模式,其中存在多个都具有默认实现的覆盖点,但是组合的默认实现本身不合法-任何功能实现都必须是子类。 (是的,我不喜欢模板方法模式;)

  • 问题内容: 在Java中,我可以在抽象类中获取扩展它的具体类的实例吗? 问题答案: 是的,您可以致电。这将为您提供运行时类型为的实例。 如果只需要类的名称,则可以使用。 最后,还有和。我一直使用前者来打印可读的类名以记录文件等。