Члены типа пересечения

Этот вопрос относится к: Лямбда-тип пересечения Вопрос

Пожалуйста, смотрите пример:

public class X {
  Object o = (I & J) () -> {};
}
interface I {
   public void foo(); 
}
interface J {
   public void foo();
   public void bar(); 
}

Я пытаюсь понять, каковы члены типа пересечения. Пожалуйста, смотрите: JLS.

Из последнего утверждения не ясно:

Тогда тип пересечения имеет те же члены, что и тип класса (§8) с пустым телом, прямым суперклассом Ck и прямыми суперинтерфейсами IT1, ..., ITn, объявленными в том же пакете, в котором появляется тип пересечения.

Не ясно, являются ли члены типа пересечения (объединение) всеми членами всего суперкласса Ck и суперинтерфейса ITk или это действительно пересечение всех членов суперкласса Ck и суперинтерфейса ITk.

2 ответа

Решение

Я понимаю, что это союз, то есть думать, что класс объявляется как implements I,J (или в словах спецификации: class IntersectionType extends Ck implements IT1, IT2, ... ITn).

Термины "тип пересечения" и "тип объединения" в литературе по теории типов происходят от теоретико-множественной интерпретации типов, где String описывает (бесконечный) набор всех возможных строк.

Тип пересечения - это пересечение двух типов; Comparable & Serializable состоит из пересечения Comparable а также Serializable; его элементы - это те, которые сравнимы и сериализуемы.

Члены типа пересечения (например, методы) будут выглядеть как объединение членов пересекаемых типов; это часто вводит людей в заблуждение, что они должны называться профсоюзными.

Java не имеет полноценных типов пересечений; они отображаются только в нескольких местах, таких как границы общих типов и целевые типы лямбды.

Другие вопросы по тегам