相交类型是什么类型?

ski*_*iwi 7 java java-8

请考虑以下使用交叉类型的能力的代码,它是在Java 8中添加的:

private <E, T extends List<E> & RandomAccess> void takeList(T list) {

}

private void fakingRandomAccess() {
    List<Integer> linkedList = new LinkedList<>();
    takeList((List<Integer> & RandomAccess)linkedList);
}
Run Code Online (Sandbox Code Playgroud)

我已经制定了一个takeList方法,它只采用具有(接近)恒定访问时间的列表,无论出于何种原因,但我可以想象有些情况确实需要这样做.

路过的ArrayList<E>进入方法应该工作得很好,但是通过交叉型也可以传递一个LinkedList<E>假装它有固定的访问时间.

现在我的问题是:

  • 有没有办法存储(List<Integer> & RandomAccess)linkedList在指定类型的对象中?
  • 我可以使用类型交叉点来简化takeList方法吗?

Hol*_*ger 5

你正在混合两种不同的东西.

如何序列化lambda?问题和答案有一个lambda表达式被强制转换为交集类型.

Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!");
Run Code Online (Sandbox Code Playgroud)

这告诉编译器生成与交集类型兼容的类型.因此,lambda表达式的生成类将是RunnableSerializable.


在这里,您将具体类的实例转换为交集类型:

(List<Integer> & RandomAccess)linkedList
Run Code Online (Sandbox Code Playgroud)

这要求运行时检查具体实例的类是否实现了适当的类型,即满足所有接口.此运行时检查失败,因为LinkedList未实现RandomAccess.

  • 那就对了.我认为,IDE应该在警告中告诉你. (2认同)