Java中方法覆盖和泛型的问题

时间:2010-09-13 16:15:15

标签: java generics override

我一直在努力尝试覆盖泛型抽象类中的方法。

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()方法以在子对象调用它时触发,传入任何其他子对象,而不对外部代码进行任何修改?

3 个答案:

答案 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");
  }

}