Java 使用泛型时重写抽象方法

Java 使用泛型时重写抽象方法,java,generics,inheritance,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); } pub

我有以下课程:

基类

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 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
protected boolean compare(Character a, Character b){
        return a==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;
    }
}
公共类CharacterArrayManipulation扩展了ArrayManipulation{
公共字符[]最大子数组(字符[]输入){
超大子阵(输入);
}
//这不被视为压倒一切
@凌驾
布尔比较(字符a、字符b){
返回a==b;
}
}

首先,您的超类不应该知道它的子类,因此
数组操作.largestSubArray()的实现应该是空的和抽象的,或者是非空的,其主体不会对子类进行任何强制转换(强制转换是不必要的,因为
ArrayManipulation
的所有子类都将有一个覆盖版本的
compare()
,而不仅仅是
CharacterArrayManipulation

您的超类不是泛型的,因为您没有将
t
generic添加到类标题中

public abstract class ArrayManipulation<T> { ... }
不能在替代版本中使用与替代版本不同的访问修饰符

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

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

当您使用泛型占位符声明方法时,您将获得泛型方法。即使您对p使用相同的名称鞋带架和周围的职业不一样

问题是:

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

现在使用了类的泛型占位符,我认为这是您所期望的。

类不应该知道它的子类。您的代码无法编译。
ArrayManipulation
不是泛型类,因此您不能使用
ArrayManipulation
…并且在两个位置有额外的括号。您的代码是否仍保持原样您的编辑?如果是这样,请从
数组操作
中的方法声明中删除
中的尖括号。我按照您的建议进行了尝试,它似乎仍然有相同的错误,请检查注释。compare()方法仍然是泛型的,不应该是。它应该声明为
抽象布尔比较(ta,tb);
,而不是作为
抽象布尔比较(ta,tb);
。否则,它不是相同的T。
abstract <T> boolean compare(T a,T b);
abstract boolean compare(T a,T b);