如何将compareTo方法强制转换为实现Comparable的泛型类?

时间:2018-11-14 15:22:00

标签: java

我有一个类型为Person的Arraylist。名称是我创建的类。在我的mainapp中,我正在创建一些Name对象,将每个name-object设置为person对象,然后将person对象添加到ArrayList中。当我尝试使用Collections.sort()对列表进行排序时,出现ClassCastException。

我看不出是什么问题。

到目前为止,这是我的代码:

public class Person<T> implements Comparable<Person<T>> {

private T name;

public T getName() {
    return name;
}

public void setName(T name) {
    this.name = name;
}

@Override
public int compareTo(Person<T> o) {
    return ((Person<T>) this.getName()).compareTo((Person<T>) o.getName());
}

}

3 个答案:

答案 0 :(得分:4)

getName()的返回值类型为T,但是您试图将其强制转换为Person<T>。要解决此问题,您需要直接比较名称而不进行强制转换:

public int compareTo(Person<T> o) {
    return this.getName().compareTo(o.getName());
}

现在,这将导致另一个错误,因为编译器不知道T是否具有compareTo()方法。要解决此问题,您需要为类型T添加一个绑定:

public class Person<T implements Comparable<T>> implements Comparable<Person<T>>

注意:

在我看来,这似乎过度使用了泛型。当name是唯一自然的选择时,为什么应该允许String为泛型类型?为什么需要Name类?可能只是String的包装,所以您应该直接使用String

答案 1 :(得分:1)

您正在将类型为this.getName()的{​​{1}}强制转换为T。即您正在将名称强制转换为人员,因此Person<T>(“名称不是人员”)。

要解决此问题,请删除演员表并直接比较名称。忽略null安全,它将是:

ClassCastException

请注意,类名称也需要return getName().compareTo(o.getName());

答案 2 :(得分:0)

您的名字为什么是类型?这看起来有点奇怪。可能是您打算这样做吗?

public class Person implements Comparable<Person> {

    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int compareTo(Person other) {
        return this.name.compareTo(other.getName());
    }
}