Члены типа пересечения
Этот вопрос относится к: Лямбда-тип пересечения Вопрос
Пожалуйста, смотрите пример:
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 не имеет полноценных типов пересечений; они отображаются только в нескольких местах, таких как границы общих типов и целевые типы лямбды.