我有以下课程:
基础课程
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;
}
}
答案 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);
现在使用了该类的通用占位符,这是您的预期。