我正面临这个问题中描述的问题,但想找到一个没有所有演员表和 @SuppressWarning 注释的解决方案(如果可能的话)。
一个更好的解决方案是建立在引用的解决方案之上:
- 删除@SuppressWarning
- 去除石膏
此处介绍的解决方案将根据标准评分为 2 分。如果有超过 2 个点,赏金会以最多点或“最优雅”的点解决。
我正面临这个问题中描述的问题,但想找到一个没有所有演员表和 @SuppressWarning 注释的解决方案(如果可能的话)。
一个更好的解决方案是建立在引用的解决方案之上:
此处介绍的解决方案将根据标准评分为 2 分。如果有超过 2 个点,赏金会以最多点或“最优雅”的点解决。
没有演员表,没有@SuppressWarning,只有几行:
public abstract class SuperClass<T extends SuperClass<T>> {
protected T that;
public T chain() {
return that;
}
}
public class SubClass1 extends SuperClass<SubClass1> {
public SubClass1() {
that = this;
}
}
public class SubClass2 extends SuperClass<SubClass2> {
public SubClass2() {
that = this;
}
}
一种方法是getThis()
在Parent
类中定义一个抽象方法,并让所有Child
类覆盖它,返回this
引用。这是一种this
在类层次结构中恢复对象类型的方法。
代码如下所示:
abstract class Parent<T extends Parent<T>> {
protected abstract T getThis();
public T example() {
System.out.println(this.getClass().getCanonicalName());
return getThis();
}
}
class ChildA extends Parent<ChildA> {
@Override
protected ChildA getThis() {
return this;
}
public ChildA childAMethod() {
System.out.println(this.getClass().getCanonicalName());
return this;
}
}
class ChildB extends Parent<ChildB> {
@Override
protected ChildB getThis() {
return this;
}
public ChildB childBMethod() {
return this;
}
}
public class Main {
public static void main(String[] args) throws NoSuchMethodException {
ChildA childA = new ChildA();
ChildB childB = new ChildB();
childA.example().childAMethod().example();
childB.example().childBMethod().example();
}
}
根据要求,没有Casting也没有@SuppressWarnings。几天前,我从Angelika Langer - Java Generics FAQs中学到了这个技巧。
参考:
一种解决方案是覆盖子类中的方法并将返回类型更改为更具体的类型,即。子类型。这需要铸造。不要使用典型的(Child)
演员表,而是使用Class#cast(Object)
方法
public class Parent {
public Parent example() {
System.out.println(this.getClass().getCanonicalName());
return this;
}
}
public class Child extends Parent {
public Child example() {
return Child.class.cast(super.example());
}
public Child method() {
return this;
}
}
演员表隐藏在标准方法中。从源头Class
。
public T cast(Object obj) {
if (obj != null && !isInstance(obj))
throw new ClassCastException(cannotCastMsg(obj));
return (T) obj;
}