Проблема сопоставления шаблонов Java 16 с Intellij IDEA 2020.3.3 (ожидается выражение)

Как мы знаем, в Java 16 появились новые функции, такие как записи, запечатанные интерфейсы и классы, а также сопоставление с образцом.

Сегодня я хотел использовать их в своем учебном проекте. Однако столкнулся с проблемой, может я чего-то не понимаю.

Итак, ситуация выглядит так, как на данном изображении, которое представляет мой проект Intellij Idea: у меня есть пакеты: client и order Класс клиента - это запечатанный интерфейс с тремя реализациями: Regular, Vip и SuperVip:

      package com.example.records.domain.client;
public sealed interface Client permits Client.Regular, Client.SuperVip, Client.Vip {
        
            Limit currentLimit();
        
            record Regular() implements Client {
        
                @Override
                public Client.Limit currentLimit() {
                    return Client.Limit.of((short) 10);
                }
            }
        
        
            record Vip() implements Client {
        
                @Override
                public Client.Limit currentLimit() {
                    return Client.Limit.of((short) 20);
                }
            }
        
            record SuperVip() implements Client {
        
                @Override
                public Client.Limit currentLimit() {
                    return Client.Limit.of((short) 100);
                }
            }
        
        
            record Limit(short value) {
                public Limit {
                    if (value < 0) throw new IllegalArgumentException("Values below 0 not allowed!");
                }
        
                static Limit of(short value) {
                    return new Limit(value);
                }
            }
        }

Класс заказа - это простой агрегат, известный из DDD: Но есть проблема с оператором switch:

      package com.example.records.domain.order;

import com.example.records.domain.OrderId;
import com.example.records.domain.client.Client;
import com.example.records.domain.client.Client.*;
import com.example.records.shared.Money;
import com.example.records.shared.Result;

import java.util.LinkedList;
import java.util.List;

public class Order() {
    private final OrderId orderId;
    private final Client client;
    private final LinesItems linesItems = LinesItems.empty();

    Order(OrderId orderId, Client client) {
        this.orderId = orderId;
        this.client = client;
    }

    public Result add(LineItem lineItem) {
       return switch (client) {
            case Regular r -> addAnItemIfTheLimitIsNotExceeded(r.);
            case Vip v -> addAnItemIfTheLimitIsNotExceeded(v.);
            case SuperVip sv -> addAnItemIfTheLimitIsNotExceeded(sv.);
        };
    }

    private Result addAnItemIfTheLimitIsNotExceeded(Limit limit) {
        // TODO need impl
        return Result.OK;
    }


    private static class LinesItems {
        private final List<LineItem> lines = new LinkedList<>();

        private LinesItems() {}

        void add(LineItem lineItem) {
            this.lines.add(lineItem);
        }

        Money cost() {
            return lines.stream().map(LineItem::cost).reduce(Money.ZERO, Money::add);
        }

        static LinesItems empty() {
            return new LinesItems();
        }
    }
}

record LineItem(Money cost) {}

Другие классы:

      package com.example.records.domain;

public record OrderId(String value) {

    public OrderId {
        validate();
    }

    private void validate() {
        if (value == null)
            throw new IllegalArgumentException("Null value not allowed!");
        if (value.isBlank())
            throw new IllegalArgumentException("Blank value not allowed!");
    }
}
package com.example.records.shared;

import java.math.BigDecimal;

public record Money(BigDecimal value) {

    public static final Money ZERO = new Money(new BigDecimal("0.00"));

    public Money add(Money money) {
        return new Money(this.value.add(money.value));
    }
}
package com.example.records.shared;

public sealed interface Result {

    Success OK = new Success();

    record Success() implements Result{}
    record Failure(String message) implements Result {}
}

Я получаю "(Ожидаемое выражение)" Где я ошибся? (Экспериментальные функции включены, я установил Java 16 open jdk)

2 ответа

Типовые узоры в instanceof являются последней (не предварительной) функцией в Java 16. Однако шаблоны типов в switchеще не в Java 16; ожидается, что они скоро прибудут.

Владелец jeps 394 Гэвин Бирман уже представил JEP для этой функции.

Сопоставление с шаблоном для переключателя (предварительная версия)

Он еще не нацелен на выпуск.

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