使用泛型时覆盖抽象方法

时间:2016-06-05 11:31:24

标签: java generics inheritance

我有以下课程:

基础课程

public abstract class ArrayManipulation {

    public <T> T[] largestSubArray(T[] a){
        (((CharacterArrayManipulation)this).compare(a[0],a[1]); 
         return a;
     }

    abstract <T> boolean compare(T a,T b);
}

子类

public class CharacterArrayManipulation extends ArrayManipulation<Character> {

    public Character[] largestSubArray(Character[] input){

        super.largestSubArray(input)); 
    }

   //This is not seen as overriding
protected boolean compare(Character a, Character b){
        return a==b;
    }
}

我想覆盖子类compare中的CharacterArrayManipulation函数。当我尝试这样做时,我明白了 CharacterArrayManipulation must either be declared abstract or implement abstract method compare(T,T) in ArrayManipulation

修改

我在评论后将其更改为以下内容,似乎仍然会出现同样的错误:

基础课程

public abstract class ArrayManipulation<T> {

    public T[] largestSubArray(T[] a){
    this.compare(a[0],a[1]); 
         return a;
     }

    abstract boolean compare(T a,T b);
}

子类

public class CharacterArrayManipulation extends ArrayManipulation<Character> {

    public Character[] largestSubArray(Character[] input){

        super.largestSubArray(input)); 
    }

   //This is not seen as overriding
@Override
boolean compare(Character a, Character b){
        return a==b;
    }
}

2 个答案:

答案 0 :(得分:3)

首先,你的超类不应该对它的子类有任何了解,因此ArrayManipulation.largestSubArray()的实现应该是空的和抽象的,或者是非空的,并且一个不执行任何转换的主体到子类(由于ArrayManipulation的所有子类都有compare()的重写版本,而不仅仅是CharacterArrayManipulation),因此不需要强制转换。

您的超级课程并非通用,因为您尚未将T通用添加到课程标题中。

public abstract class ArrayManipulation<T> { ... }

然后,您应该从largestSubArray()方法和compare()方法中删除通用声明。

public T[] largestSubArray(T[] a){ ... }
boolean compare(T a, T b);

您不能在覆盖版本中使用与覆盖版本不同的访问修饰符。

// Note the lack of `protected`
boolean compare(Character a, Character b){ ... }

旁注:重写方法时应使用@Override注释。它将为您提供更多适用的错误消息,并明确表示您正在尝试覆盖方法。

答案 1 :(得分:1)

当您使用通用占位符声明方法时,您将获得一个通用方法。即使您对占位符使用与周围类相同的名称,也不一样。

问题是:

abstract <T> boolean compare(T a,T b);

T不同(尝试重命名为U时会出现同样的错误。)

正确理解您的代码时,只需删除此附加泛型变量的声明即可解决您的问题:

abstract boolean compare(T a,T b);

现在使用了该类的通用占位符,这是您的预期。