我一直在努力尝试覆盖泛型抽象类中的方法。
public abstract class Grandparent<T extends Grandparent>
public T set(final T other) //does stuff I don't want to do
public abstract class Parent<T extends Parent<T>> extends Grandparent<T>
public T set(final Parent<?> other) // does stuff I want to do
所有子类都扩展了父<child>
。
但是,我不能通过构造其中一个子类来调用我想要的set()函数。
Child_1 test = new Child_1();
Child_1 test_2 = new Child_1();
test.set(test_2) //this calls the function I don't want
Parent<Child_1> test_3 = new Child_1();
Parent<Child_1> test_4 = new Child_1();
test3.set(test_4) //this calls the function I do want
但是,这需要修改已有的代码。很多。我不想将set方法重写为
public T set(T other)
因为那时我将失去从不同的子类对象设置一个子类对象的能力。
如何编写set()方法以在子对象调用它时触发,传入任何其他子对象,而不对外部代码进行任何修改?
答案 0 :(得分:0)
如何编写set()方法 在子对象调用时触发 它,传入任何其他子对象, 没有任何外部修改 码?
你能否包括你想做的代码建模 - 我只想清楚你想要什么,因为目前我怀疑它是不允许的 - 无论你做什么。
修改
我以前用...测试的类
package test.stack.overflow;
public abstract class GrandParent<T extends GrandParent>
{
public T set(final GrandParent<?> other)
{
System.out.println("GrandParent.set=" + other);
return null;
}
}
public abstract class Parent<T extends Parent<T>> extends GrandParent<T>
{
public Parent<?> set(final Parent<?> other)
{
System.out.println("Parent.set=" + other);
return other;
}
}
public class Child_1 extends Parent<Child_1>
{
}
public class Child_2 extends Parent<Child_2>
{
}
public class TestPeerage
{
public static void main(String[] args)
{
Child_1 c1 = new Child_1();
c1.set(new Child_2());
c1.set(new Child_1());
Parent<Child_1> pc1 = new Child_1();
pc1.set(new Child_2());
pc1.set(new Child_1());
}
}
答案 1 :(得分:0)
要覆盖方法,您需要提供覆盖等效签名,这意味着方法名称,参数的数量和类型必须相等。对于Grandparent.set()
和Parent.set()
,情况并非如此。因此,Parent.set()
重载,而不是覆盖Grandparent.set()
。
我看到的最简单的解决方案是将方法签名概括如下:
public abstract class Grandparent<T extends Grandparent>
public T set(Grandparent<?> other)
public abstract class Parent<T extends Parent<T>> extends Grandparent<T>
public T set(Grandparent<?> other)
这样,方法会覆盖,您不必修改任何子类。
答案 2 :(得分:0)
随后的评论有助于澄清你的目标,但我仍然感到困惑。也许这会有所帮助;如果没有,请尝试详细说明您的问题。
public abstract class Grandparent<T extends Grandparent<T, Q>, Q extends Grandparent<T, Q>>
{
public abstract Q set(Q other);
}
class Parent<T extends Parent<T>>
extends Grandparent<T, Parent<T>>
{
@Override
public Parent<T> set(Parent<T> other)
{
throw new UnsupportedOperationException("set");
}
}