我有一个子类,它声明了我的抽象超类中的所有方法,但它仍然给我一个错误,指出我的类不是抽象的。我无法弄清楚为什么会抛出这个错误。
我得到的具体错误是
PhoneBookEntry.java:1:错误:PhoneBookEntry不是抽象的,并且不会覆盖Comparable中的抽象方法compareTo(Object)
我的问题代码:
public abstract class PhoneNumber implements Comparable
{
protected String firstName, lastName;
protected int number;
public PhoneNumber(String firstName, String lastName, int number)
{
this.firstName = firstName;
this.lastName = lastName;
this.number = number;
}
public abstract String getLastName();
public abstract String getFirstName();
public abstract int getNumber();
public int compareTo(PhoneNumber other)
{
int last = other.lastName.compareTo(lastName);
int first = other.firstName.compareTo(firstName);
int num = other.number - number;
if(last > 0)
return 1;
else if(last < 0)
return -1;
else
if(first > 0)
return 1;
else if(first < 0)
return -1;
else
if(num > 0)
return 1;
else if(num < 0)
return -1;
else
return 0;
}
}
我的子类:
public class PhoneBookEntry extends PhoneNumber
{
public PhoneBookEntry(String firstName, String lastName, int number)
{
super(firstName, lastName, number);
}
public String getLastName()
{
return lastName;
}
public String getFirstName()
{
return firstName;
}
public int getNumber()
{
return number;
}
public int compareTo(PhoneNumber other)
{
super.compareTo(other);
}
}
答案 0 :(得分:10)
这是问题所在:
public int compareTo(PhoneNumber other)
{
super.compareTo(other);
}
您已经指定您只是实现了原始类型Comparable
,它具有签名为:
int compareTo(Object)
最简单的解决方法是将PhoneNumber
的声明更改为:
public abstract class PhoneNumber implements Comparable<PhoneNumber>
您可以实施compareTo(Object)
,但您真的希望能够将电话号码与任何其他对象进行比较吗?声称能够将电话号码与其他电话号码进行比较更有意义(IMO)。
答案 1 :(得分:3)
您正在实施Comparable
的原始版本,其compareTo
方法需要Object
。
实现Comparable
的通用版本:
public abstract class PhoneNumber implements Comparable<PhoneNumber>
答案 2 :(得分:1)
变化:
public int compareTo(PhoneNumber other)
{
super.compareTo(other);
}
到
@Override
public int compareTo(Object other)
{
return super.compareTo((PhoneNumber)other);
}
答案 3 :(得分:1)
那是因为
Comparable.compareTo(Object o); {}
不等于
public int compareTo(PhoneNumber other)
{
super.compareTo(other);
}
更改
public abstract class PhoneNumber implements Comparable
到
public abstract class PhoneNumber implements Comparable<PhoneNumber>
它将以你想要的TypeSafe方式工作。
答案 4 :(得分:1)
不会覆盖Comparable中的抽象方法compareTo(Object)
您的子类没有compareTo(Object)
您可以添加这样的方法,但最佳解决方案是更改
public abstract class PhoneNumber implements Comparable<PhoneNumber> {
这样它期望compareTo(PhoneNumber)
就是你所拥有的。