【发布时间】:2018-11-09 03:40:04
【问题描述】:
这是来自 Oracle JDK 8 实现的 Stream 接口:
public interface Stream<T> extends BaseStream<T, Stream<T>> {
Stream<T> sorted();
}
并且在运行时很容易将其炸毁,并且在编译时不会生成警告。这是一个例子:
class Foo {
public static void main(String[] args) {
Arrays.asList(new Foo(), new Foo()).stream().sorted().forEach(f -> {});
}
}
编译得很好,但会在运行时抛出异常:
Exception in thread "main" java.lang.ClassCastException: Foo cannot be cast to java.lang.Comparable
sorted 方法未定义在编译器实际可以捕获此类问题的位置可能是什么原因?也许我错了,但不是这么简单吗:
interface Stream<T> {
<C extends Comparable<T>> void sorted(C c);
}
?
显然,实现这一点的人(在编程和工程方面比我早几年)肯定有一个我看不到的很好的理由,但那是什么原因呢?
【问题讨论】:
-
你的意思是
Comparator?已经有一个overload。不知道为什么你需要C。 -
这是不可能的。
-
由于泛型的性质。泛型的全部意义在于您正在实现 generic 功能,它排除了特定于类型的逻辑。您的示例代码没有任何意义。我认为您正在尝试重新定义
T(这是不可能的),但实际上您只是为无用的参数定义了一个类型。 -
但是
sorted不接受任何参数作为输入 - 你要从哪里获取这个参数? -
这个问题早于 java 8 btw
标签: java java-8 java-stream comparable