相交类型是什么类型?

时间:2014-04-02 18:20:12

标签: 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);
}

我已经制作了一个takeList方法,它只接受具有(接近)持续访问时间的列表,无论出于何种原因,但我可以想象有些情况确实需要这样做。< / p>

ArrayList<E>传递给方法应该可以正常工作,但是通过类型交叉点,您也可以通过假装它具有持续访问时间来传递LinkedList<E>

现在我的问题是:

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

1 个答案:

答案 0 :(得分:5)

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

How to serialize a lambda?问题&amp;回答有一个 lambda表达式被强制转换为交集类型。

Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!");

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


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

(List<Integer> & RandomAccess)linkedList

这请求运行时 - 检查具体实例的类是否实现了适当的类型,即满足所有接口。由于LinkedList未实现RandomAccess

,此运行时检查失败