当前位置: 首页 > 知识库问答 >
问题:

可以通过Java泛型类型系统强制自然排序吗?

巢嘉志
2023-03-14

树集(收藏)

构造包含指定集合中元素的新树集,并根据其元素的自然顺序进行排序。插入到集合中的所有元素必须实现可比较的接口。此外,所有这些元素必须相互可比:e1。compareTo(e2)不能为集合中的任何元素e1和e2抛出ClassCastException。

是否有可能在语法上强制集合中的E


共有3个答案

养聪
2023-03-14

来自塔维亚·巴恩斯的评论:

他们可以做类TreeSet

因此,使用

如果TreeSet希望创建一个具有不可比较类的TreeSet:为什么是运行时异常,而不是编译时错误?

感谢所有帮助回答问题的人!

顾学真
2023-03-14

您可以使用以下工厂方法使您的项目需要:

public static <T extends Comparable<? super T>> SortedSet<T> safeSortedSet() {
    return new TreeSet<T>();
}

然后是代码:

Set<String> pass = safeSortedSet();
Set<Foo> fail = safeSortedSet();

第二行生成编译错误:

错误:(99,38)java:不兼容的类型:推理变量T具有不兼容的边界
等式约束:测试。Foo
上限:java。朗。可比

公羊绪
2023-03-14

是的,但不包括施工人员;您必须公开一个工厂方法,它可以对集合类型施加超出类作为一个整体施加的约束。例如,他们可以写

public class TreeSet<E> { ...
  public static <E extends Comparable<? super E>> TreeSet<E>
      create(Collection<? extends E> collection) {
    TreeSet<E> set = new TreeSet<E>();
    set.addAll(collection);
    return set;
  }
  ...
}
 类似资料:
  • 问题内容: 我想使用泛型类型来确保方法的参数具有相同的类型,如下所示: 我假设传递给此方法的两个参数(a和b)始终必须具有相同的类型。但是令我惊讶的是,无论传递了什么参数,我都能将任何类型的参数(甚至是基本参数)传递给方法x,就好像T被抹去了Object一样。 到目前为止,我发现的唯一解决方法是使用“ extends”,如下所示: 但是,尽管我可以忍受,但这并不是我想要的。 有没有一种方法可以使用

  • 本文向大家介绍什么是强类型系统?相关面试题,主要包含被问及什么是强类型系统?时的应答技巧和注意事项,需要的朋友参考一下 答:RTTI:类型识别系统。  

  • 有没有一种简单的方法可以做到这一点: 编辑:我写了一份正确答案的工作副本:

  • 我读了很多文章,但我不明白这两行之间的区别: 我看到的唯一区别是第一行触发了“未检查的分配”警告。

  • 我在Kotlin中有一个方法,它返回一个泛型列表的Rx可观察值: 因为Kotlin list特征定义为,Java将看到返回类型为。 是否有一种方法告诉Kotlin编译器,Java应该将其视为?

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或