Как убрать непроверенное предупреждение для методов интерфейса Fluent по умолчанию - PullRequest
0 голосов
/ 26 июня 2019

Мне было интересно, есть ли способ убрать непроверенное предупреждение для следующего кода, который предоставляет свободный API, который возвращает сам себя.

public interface Taggable<T> {

    /**
     * Should return the underlying set that holds the tags.
     *
     * @return set
     */
    Set<String> getTags();

    @SuppressWarnings("unchecked")
    default T tag(@NotNull String... tags) {
        for (String tag : tags) {
            getTags().add(tag);
        }
        return (T) this;
    }

    @SuppressWarnings("unchecked")
    default T untag(@NotNull String tag) {
        getTags().remove(tag);
        return (T) this;
    }

}

Использование будет

@Data
public class MyObject implements Taggable<MyObject> {
   private Set<String> tags;
}

MyObject t = new MyObject()
   .tag("abc")
   .tag("def");

Рабочий пример с предупреждением о подавлении https://repl.it/@trajano/fluent

1 Ответ

1 голос
/ 26 июня 2019
public interface Taggable<T extends Taggable<T>>

и изменить

(T) this

до

this

Итак:

default Taggable<T> tag(@NotNull String... tags) {
    Collections.addAll(getTags(), tags);
    return this;
}

Это то, что делает базовый класс Enum (для всех классов enum).

Свободный API, шаблон компоновщика, в общем, немного более многословен. Однако преимущество не в том, чтобы иметь такие артефакты, как getTags. Делегирование реализации интерфейса тега / untag показалось бы лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...