我正在尝试创建一个泛型方法,但它需要来自子类的数据。有没有办法做到这一点,还是有更好的实施?
我的情况示例:
public class Super {
public static Object method() {
return doSomethingWith(specificToSubClassValue);
}
}
public class Sub1 extends Super {
public static String specificToSubClassValue = "123";
}
public class Sub2 extends Super {
public static String specificToSubClassValue = "456";
}
我显然不能这样做。什么是更好的方法?
我能想到的一个替代方法是覆盖每个子类中的#method方法,但是每个实例中的代码都是相同的,所以我想把它放在父类中(它不会成为真正被覆盖,因为它是静态的),但我不知道如何处理它,因为它依赖于子类值。
答案 0 :(得分:0)
在Super
中声明一个抽象方法,该方法将用于从实现类返回值。请注意,这只能通过非静态方法实现。根据@JB Nizet的评论,子类不能覆盖静态方法。我已经从下面的代码中删除了静态修饰符,向您展示它是如何工作的。
public class Super {
public static Object method() {
return doSomethingWith(specificToSubClassValue);
}
protected abstract Object getValue ();
}
public class Sub1 extends Super {
public static String specificToSubClassValue = "123";
@Override
protected Object getValue () {
return specificToSubClassValue;
}
}
public class Sub2 extends Super {
public static String specificToSubClassValue = "456";
@Override
protected Object getValue () {
return specificToSubClassValue;
}
}
答案 1 :(得分:0)
Java中的静态方法无法被覆盖,无法访问特定于孩子的信息:他们对继承一无所知。
这里需要的是实例方法,您可以覆盖它。您也可以使用泛型。
public class Super<T> {
public Object method() {
final T specificToSubClassValue = getSpecificToSubClassValue();
if (specificToSubClassValue != null) {
return specificToSubClassValue.hashCode();
} else {
return null;
}
}
protected T getSpecificToSubClassValue() {
return null;
}
}
class Sub1 extends Super<String> {
@Override
protected String getSpecificToSubClassValue() {
return "abc";
}
}
class Sub2 extends Super<Integer> {
@Override
protected Integer getSpecificToSubClassValue() {
return 123;
}
}
答案 2 :(得分:-1)
嗯,继承的整个想法是超类在没有子类的情况下不应该做那么多。否则整个遗产将是毫无意义的运动和意大利面条代码。但是你正在以错误的方式解决这个问题。让子类“溢出”你需要的数据(通过getter),并使用超类中的泛型方法对子类中的数据进行处理。
超级方法的覆盖也被高估了。你应该努力使你的超级方法尽可能灵活和可重复使用,甚至努力争取重载,而不是覆盖。
你可以:
public class Super {
public Object method(String specificValue) {
return doSomethingWith(specificToSubClassValue);
}
然后让你的子做到这一点
public class Sub1 extends Super {
public static String specificToSubClassValue = "123";
Object method(specificToSubClassValue);
}
通过这种方式,您可以完成所需的操作,使用super方法对类特定值进行操作。