我在想有没有更好的办法。我想要的是在抽象类中有一个具体的方法,返回扩展抽象类的具体实例。
abstract class ParentClass<T extends ParentClass> extends RelativeLayout {
...
public T aMethod(){
return (T)this;
}
}
class ChildClass1 extends ParentClass<ChildClass1>{
...
}
我认为我不应该把它转换成T,因为它总是T的一个实例。
问题是没有办法引用“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
构造函数保证this
是t
的实例,因此将this
强制转换为t
是安全的。
我知道抽象类可能包含抽象和具体方法(即主体实现)。我的问题是:子类可以从抽象超类继承/覆盖具体方法吗?其次,它们必须以实现抽象方法的方式实现具体方法吗?
问题内容: 从子类对象调用该方法时,是否有任何优雅的方法可以使位于父类中的Java方法返回子类的对象? 我想在不使用其他接口和方法的情况下实现此功能,并在没有类强制转换,辅助参数等的情况下使用此功能。 更新: 抱歉,我不太清楚。 我想实现方法链,但是父类的方法存在问题:调用父类方法时,我无法访问子类方法… 我想我已经提出了我的想法的核心。 因此,方法应返回类的对象。 问题答案: 如果您只是在寻找针
问题内容: 当其中的所有方法都是具体的时,有人在声明类抽象时有一些实际的编程情况吗? 问题答案: 好吧,您可能正在使用模板方法模式,其中存在多个都具有默认实现的覆盖点,但是组合的默认实现本身不合法-任何功能实现都必须是子类。 (是的,我不喜欢模板方法模式;)
我正在做一个绘图项目,我有一些工具(例如画笔、橡皮擦等),它们都是自己的类,每个都继承自一个抽象工具类,具有一些基本属性和抽象/非抽象方法。我看到的主要问题是,当我需要更改这些工具的颜色时,我想找出一种方法来为所有工具更改颜色,但也允许某些工具(如橡皮擦)保持不变,因为它的颜色应该始终只是背景色。 我正在从其他地方接收onColorChange(int newColor)方法调用,但这是触发工具颜
问题内容: 在Java中,我可以在抽象类中获取扩展它的具体类的实例吗? 问题答案: 是的,您可以致电。这将为您提供运行时类型为的实例。 如果只需要类的名称,则可以使用。 最后,还有和。我一直使用前者来打印可读的类名以记录文件等。