java - java中的这种语法是什么`集.SetView`?
问题描述
这是我试图理解的一些代码
public static <E> Sets.SetView<E> difference(final Set<E> set1, final Set<?> set2) {
Preconditions.checkNotNull(set1, "set1");
Preconditions.checkNotNull(set2, "set2");
final Predicate<Object> notInSet2 = Predicates.not(Predicates.in(set2));
return new Sets.SetView<E>() {
public Iterator<E> iterator() {
return Iterators.filter(set1.iterator(), notInSet2);
}
public int size() {
return Iterators.size(this.iterator());
}
public boolean isEmpty() {
return set2.containsAll(set1);
}
public boolean contains(Object element) {
return set1.contains(element) && !set2.contains(element);
}
};
}
我对函数返回的内容感到困惑,当我使用它时,函数似乎正在返回Sets.SetView<E>
例如
Set<Integer> a = new HashSet<>();
Set<Integer> b = new HashSet<>();
a.add(1);
Sets.difference(a, b); // is of type Sets.SetView<Long>
<E>
前面的额外前缀是什么?
为什么实际返回值包含方法定义?
return new Sets.SetView<E>() {
public Iterator<E> iterator() {
return Iterators.filter(set1.iterator(), notInSet2);
}
public int size() {
return Iterators.size(this.iterator());
}
public boolean isEmpty() {
return set2.containsAll(set1);
}
public boolean contains(Object element) {
return set1.contains(element) && !set2.contains(element);
}
};
解决方案
不要读为<E> Sets.SetView<E>
. 该方法返回Sets.SetView<E>
。前置<E>
是静态方法的通用模板语法。
推荐阅读
- javascript - 使用 Wordpress API 和 Javascript 库添加带有媒体的帖子
- python - 在 Tkinter 中制作一个对东、西和南都具有粘性的小部件
- windows - 您可以在 windows MSI/Orca.exe 中创建名称包含句点的目录吗?
- javascript - 猫鼬不会保存用户
- python - 转到 Spyder 4.0..0 中缺少的定义
- python - 使用什么模式来删除文本文件中的任何未知字符,例如将中文翻译成拉丁文?
- python - 使用 Python 从 Outlook 为每个收件人提供个性化附件
- javascript - 将 mapDispatchAsProps 定义为简单的 actionCreators 对象不会将道具传递给组件
- javascript - Javascript:检查数组是否是几乎递增的序列
- python - 使用 while 循环将项目添加到列表