gpt4 book ai didi

java - CompareTo 的参数和隐式类型转换

转载 作者:行者123 更新时间:2023-11-30 04:33:02 25 4
gpt4 key购买 nike

import java.util.*;

public class Employee
{
private int empId;
private String name;
private int age;
public Employee(String name, int id, int age )
{
this.name = name;
this.empId = id;
this.age = age;
}
public int getId()
{
return empId;
}
public int getAge()
{
return age;
}
public String getName()
{
return name;
}

}

class SortById extends Employee implements Comparable<SortById>
{
public SortById(String name, int id, int age)
{
super(name, id, age);
}
public int compareTo(SortById other)
{
if (this.getId() > other.getId()) return 1;
if (this.getId() < other.getId()) return -1;
return 0;

}
}

class SortByName extends Employee implements Comparable<SortByName>
{
public SortByName(String name, int id, int age)
{
super(name, id, age);
}

public int compareTo(SortByName other)
{
if (this.getName().compareTo(other.getName()) > 0) return 1;
if (this.getName().compareTo(other.getName()) < 0) return -1;
return 0;

}
}

class Test
{
public static void main(String args[])
{
Employee[] array = new SortById[3];
array[0] = new SortById("Gautam", 1222, 20);
array[1] = new SortById("Shivam", 1221, 20);
array[2] = new SortById("Ankit", 1223, 21);
System.out.println(array[0] instanceof SortByName);

Arrays.sort(array);
for (int i = 0; i < array.length; i++)
System.out.println("ID: " + array[i].getId() + " Name: " + array[i].getName() + " Age: " + array[i].getAge());
Employee[] array2 = new SortByName[3];
array2[0] = new SortByName("Gautam", 1222, 20);
array2[1] = new SortByName("Shivam", 1221, 20);
array2[2] = new SortByName("Ankit", 1223, 21);
Arrays.sort(array2);
for (int i = 0; i < array2.length; i++)
System.out.println("ID: " + array2[i].getId() + " Name: " + array2[i].getName() + " Age: " + array2[i].getAge());

}
}

这个程序运行良好,我只是想问,因为我使用的是 Comparable 的参数化版本,我传递到 compareTo 中的引用应该是 >SortById 类型还是 SortByName 类型?

即使引用的类型为 Employee,代码也可以正常运行,尽管它指向其子类(SortByNameSortById)。

隐式转换是如何发生的?我读过这是不可能的,即不可能将父类(super class)类型隐式转换为子类。

最佳答案

您永远不会调用 compareTo 这解释了为什么您不需要强制转换。实际的调用是在 Arrays.sort 中进行的,它负责处理它(通过实际使用原始的 Comparable)

此外,在这种情况下,编译器将生成 2 个 compareTo 方法:一个是使用 SortByXX 参数显式定义的方法,另一个是使用 Object 定义的方法 参数委托(delegate)给第一个参数。

正如@martijno所说,如果您在数组中添加一个简单的Employee,您将会遇到问题,这将导致ClassCastException(来自EmployeeComparableSortByXX)。如果混合 SortByNameSortById 也会发生同样的情况。

关于java - CompareTo 的参数和隐式类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14158336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com