Java 集合 max 方法

问题描述 投票:0回答:1

java.util.Collections
类中,
max
方法声明如下:

static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
        // impl.
}

我的问题是,为什么类型参数

T
显式地以
Object
为上限?

如果将该方法声明为:

,会有什么不同
static <T extends Comparable<? super T>> T max(Collection<? extends T> coll) {
        // impl.
}
java generics collections
1个回答
1
投票
static <T extends Object & Comparable<? super T>> max1(Collection<? extends T> col) {
  // implementation...
}

static <T extends Comparable<? super T>> max2(Collection<? extends T> col) {
  // implementation...
}

max1
max2
的行为相同。可以使用相同的参数调用它们,并且可以使用相同的结果。这意味着
Object
的显式上限是不必要的。至少在现代版本的 Java 中是这样;自 Java 5(首次引入泛型时)以来,泛型可能发生了一些变化。

但至少有一个区别。使用反射,边界的报告方式不同:

import java.util.Arrays;
import java.util.Collection;

public class Main {

  public static <T extends Object & Comparable<? super T>> T max1(Collection<? extends T> col) {
    throw new UnsupportedOperationException("not implemented");
  }

  public static <T extends Comparable<? super T>> T max2(Collection<? extends T> col) {
    throw new UnsupportedOperationException("not implemented");
  }

  public static void main(String[] args) throws Exception {
    var max1 = Main.class.getMethod("max1", Collection.class);
    var max2 = Main.class.getMethod("max2", Collection.class);

    var max1Bounds = max1.getTypeParameters()[0].getBounds();
    var max2Bounds = max2.getTypeParameters()[0].getBounds();

    System.out.println("max1 bounds => " + Arrays.toString(max1Bounds));
    System.out.println("max2 bounds => " + Arrays.toString(max2Bounds));
  }
}

输出(Java 22.0.2):

max1 bounds => [class java.lang.Object, java.lang.Comparable<? super T>]
max2 bounds => [java.lang.Comparable<? super T>]
© www.soinside.com 2019 - 2024. All rights reserved.