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);