当第一个界限是类型参数时,是否有其他方法可以指定附加界限?

熊猫TG阿特伍德

我知道在Java中第一个边界是类型参数时无法指定其他边界;但是,我想知道是否有人知道另一种方法来做类似的事情并在编译时保证它的安全?我在下面提供了一个示例。

在以下代码中,我指的是:<E extends T & Comparable<T>>在这种情况下,如果类型T比较,我希望能够使用内置比较器,否则,我想指定自己的比较器。

在编译时保持类型安全的同时,还有其他替代方法吗?

public class ExampleClass<T, U> {
  [...]

  public <E extends T & Comparable<T>> ExampleClass(Function<U, E> function) {
    this.function = function; 
    this.comparator = (E a, E b) -> a.compareTo(b);
  }

  public ExampleClass(Function<U, T> function, Comparator<U> comparator) {
    this.function = function;
    this.comparator = comparator;
  }

}
哈维尔·马丁

您可以通过将第一个构造函数实现为委托给第二个构造函数的静态方法来解决您的问题,如下所示:

import java.util.Comparator;
import java.util.function.Function;

public class Test<T,U> {
  private final Function<U,T> function;
  private final Comparator<T> comparator;

  public Test(Function<U,T> function, Comparator<T> comparator) {
    this.function = function;
    this.comparator = comparator;
  }

  public static <E extends Comparable<E>, V> Test<E,V> withNatOrder(Function<V,E> function) {
      // Any of these two will do
      final Comparator<E> comp = (E a, E b) -> a.compareTo(b);
      final Comparator<E> comp2 = Comparator.naturalOrder();
      return new Test<>(function, comp);
  }
}

静态函数无法访问类类型参数T和U,因此它定义了新的独立参数。现在Test<E,V>返回类型是E确实实现Comparable的地方,而V就像您的U参数一样是无界的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否有其他方法可以创建一个空数组,然后将其填充到Python中?

来自分类Dev

''不包含'Session'的定义并且没有扩展方法'可以找到接受'object'类型的第一个参数

来自分类Dev

如何使用.each()或其他方法更改D3.js散点图中第一个点的颜色

来自分类Dev

在其他方法的参数输入中声明一个方法?

来自分类Dev

在其他方法的参数输入中声明一个方法?

来自分类Dev

只有第一个使用PHP的Mysqli Insert查询可以正常工作,而其他失败

来自分类Dev

只有第一个使用PHP的Mysqli Insert查询可以工作,而其他则失败

来自分类Dev

嵌套结构作为其他结构中的第一个定义是否具有零偏移?

来自分类Dev

嵌套结构作为其他结构中的第一个定义是否具有零偏移?

来自分类Dev

是否可以为 scipy 的差异进化指定每个参数(而不是界限)的起始值?

来自分类Dev

Spark Window 函数:是否可以直接从第一个/最后一个函数找到的行中获取其他值?

来自分类Dev

每当调用其他方法时都调用一个方法

来自分类Dev

我可以固定行的第一个div并滚动其他div吗

来自分类Dev

给对象的发送方法一个带有块的其他方法

来自分类Dev

从另一个java类覆盖这个类中的方法(附加到其他方法)

来自分类Dev

MySQL-有什么方法可以检查一个视图是否被其他视图引用?

来自分类Dev

Java线程-第一个线程完成时关闭其他线程

来自分类Dev

当第一个完成时如何安全绕开其他goroutine的结果

来自分类Dev

选择第一个选项时使用jQuery,然后隐藏其他元素

来自分类Dev

“ ILoggingBuilder”不包含“ AddNLog”的定义,也没有扩展方法“ AddNLog”接受“ ILoggingBuilder”类型的第一个参数

来自分类Dev

在c中是否有一种干净的方法可以使一个函数使用不同的参数调用其他函数?

来自分类Dev

是否可以使用默认值的第一个JavaScript参数?

来自分类Dev

vhdl选择第一个向量并重设所有其他向量

来自分类Dev

vhdl选择第一个向量并重设所有其他向量

来自分类Dev

为什么postgres的daterange的上限函数会返回一个排他界限?

来自分类Dev

“类型”不包含“程序集”的定义,找不到可以接受类型“类型”的第一个参数的扩展方法“程序集”

来自分类Dev

引用当前函数的第一个参数类型

来自分类Dev

powershell的第一个参数是object []类型吗?

来自分类Dev

Read()仅接受第一个输入,而没有其他Console.Read()的其他输入。

Related 相关文章

  1. 1

    是否有其他方法可以创建一个空数组,然后将其填充到Python中?

  2. 2

    ''不包含'Session'的定义并且没有扩展方法'可以找到接受'object'类型的第一个参数

  3. 3

    如何使用.each()或其他方法更改D3.js散点图中第一个点的颜色

  4. 4

    在其他方法的参数输入中声明一个方法?

  5. 5

    在其他方法的参数输入中声明一个方法?

  6. 6

    只有第一个使用PHP的Mysqli Insert查询可以正常工作,而其他失败

  7. 7

    只有第一个使用PHP的Mysqli Insert查询可以工作,而其他则失败

  8. 8

    嵌套结构作为其他结构中的第一个定义是否具有零偏移?

  9. 9

    嵌套结构作为其他结构中的第一个定义是否具有零偏移?

  10. 10

    是否可以为 scipy 的差异进化指定每个参数(而不是界限)的起始值?

  11. 11

    Spark Window 函数:是否可以直接从第一个/最后一个函数找到的行中获取其他值?

  12. 12

    每当调用其他方法时都调用一个方法

  13. 13

    我可以固定行的第一个div并滚动其他div吗

  14. 14

    给对象的发送方法一个带有块的其他方法

  15. 15

    从另一个java类覆盖这个类中的方法(附加到其他方法)

  16. 16

    MySQL-有什么方法可以检查一个视图是否被其他视图引用?

  17. 17

    Java线程-第一个线程完成时关闭其他线程

  18. 18

    当第一个完成时如何安全绕开其他goroutine的结果

  19. 19

    选择第一个选项时使用jQuery,然后隐藏其他元素

  20. 20

    “ ILoggingBuilder”不包含“ AddNLog”的定义,也没有扩展方法“ AddNLog”接受“ ILoggingBuilder”类型的第一个参数

  21. 21

    在c中是否有一种干净的方法可以使一个函数使用不同的参数调用其他函数?

  22. 22

    是否可以使用默认值的第一个JavaScript参数?

  23. 23

    vhdl选择第一个向量并重设所有其他向量

  24. 24

    vhdl选择第一个向量并重设所有其他向量

  25. 25

    为什么postgres的daterange的上限函数会返回一个排他界限?

  26. 26

    “类型”不包含“程序集”的定义,找不到可以接受类型“类型”的第一个参数的扩展方法“程序集”

  27. 27

    引用当前函数的第一个参数类型

  28. 28

    powershell的第一个参数是object []类型吗?

  29. 29

    Read()仅接受第一个输入,而没有其他Console.Read()的其他输入。

热门标签

归档