我在想,是否有一种方法可以消除以下代码的未经检查的警告,该代码提供了返回自己的流畅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");
的工作示例
答案 0 :(得分:1)
public interface Taggable<T extends Taggable<T>>
然后改变
(T) this
到
this
所以:
default Taggable<T> tag(@NotNull String... tags) {
Collections.addAll(getTags(), tags);
return this;
}
这是基类Enum(对于所有枚举类)的作用。
一个流畅的API,即构建器模式,通常较为冗长。
但是,优点是没有getTags
这样的伪像。
委派给标签/未标签接口实现似乎更好。