java - 是否可以覆盖通用函数?

标签 java generics inheritance

是否可以覆盖下面代码片段中所示的泛化函数?

interface A {
}

interface B extends A {
}


abstract class C {
    protected abstract <T extends A> void abc(T xyz);
}

class D extends C {
    @Override
protected void abc(B xyz) {
    // doesn't compile
    // The method abc(B) of type D must override or implement a supertype method
    }
}

谢谢

最佳答案

使用您的代码,D 的一个实例是 C 的实例,因此必须接受 A 的任何子类作为其 abc() 的参数方法。你想要的是一个只接受特定子类的实例。您需要生成 C (而不仅仅是 C#abc() )。然后你可以制作D扩展C<B> ,像这样:

interface A {
}

interface B extends A {
}

abstract class C<T extends A> {
    protected abstract void abc(T xyz);
}

class D extends C<B> {
    @Override
    protected void abc(B xyz) {
        // Compiles
    }
}

不能仅泛化方法的证明:

interface A {
}

interface B extends A {
    public void def();
}

abstract class C {
    protected abstract <T extends A> void abc(T xyz);
}

class D extends C {
    @Override
    protected void abc(B xyz) {
        xyz.def();
    }

    public static void main(String[] args) {
        D d = new D();
        d.abc(new B(){}); // Invokes def() on a B, OK
        C c = (C) d;      // Cast to a C, OK
        c.abc(new A(){}); // C#abc() applies to an A, but tries to invoke
                          // a's def(), which it lacks
    }
}

关于java - 是否可以覆盖通用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1651425/

相关文章:

java - 使用 Apache poi 在 excel 中设计折线图

java - 在 roomdb android 中面临 @Relation 的问题

java - 对参数具有特定约束的通用函数

java - Hamcrest assertThat - 类型推断

C# 使 protected 变量在子类中私有(private)(或其他解决问题的方法)

Java 从父类(super class)字段继承

java - 设置颜色项目 ListView xml

swing - JTable 行数限制

c# - 我怎样才能使这个通用接口(interface)更具类型化?

C++ - 希望虚拟仅作为重定向