gpt4 book ai didi

java - TreeSet 不能在编译时检查比较器对象吗?

转载 作者:行者123 更新时间:2023-12-02 06:00:26 25 4
gpt4 key购买 nike

当使用默认构造函数(无参数)在 Java 中创建 TreeSet 类的实例并添加两个未实现 Comparator 接口(interface)的类的对象时,该对象将引发运行时异常。这个检查可以在编译时实现吗?

我尝试过以下代码:

Dummy.java

public class Dummy {
}

TreeSetTest.java

import java.util.TreeSet;

public class TreeSetTest {

public static void main(String[] argv) {
TreeSet<Dummy> treeSet = new TreeSet<>();
treeSet.add(new Dummy());
treeSet.add(new Dummy());
}
}

编译器在创建 TreeSet 时应该提示,因为它没有实现 Comparable。

最佳答案

如果 TreeSet() 构造函数不是公共(public)的,您可以在编译时使用工厂方法进行检查,如下所示:

public static <E extends Comparable<? super E>> TreeSet<E> create() {
return new TreeSet<>();
}

您只能使用自然可比较的类型参数来调用它:

TreeSet<String> a = TreeSet.create(); // ok
TreeSet<Object> b = TreeSet.create(); // error

但是构造函数是公共(public)的; Java 中没有语言机制允许您限制用于调用构造函数的类型参数。

此构造函数必须是公共(public)的,因为它在泛型之前就存在,因此删除它会违反向后兼容性。

关于java - TreeSet 不能在编译时检查比较器对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55981353/

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