问题标签 [pecs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
515 浏览

java - 如何在 JAVA 中为具有泛型类型的可选项提供默认值

非常感谢所有的答案/评论!

为我在原始问题中输入的错误代码示例道歉。我试图简化我的问题,但显然它最终变得相当混乱。

我稍微更改了代码:

我得到了第一个错误:

无法推断 AbstractMap.SimpleEntry<> 的类型参数

所以我将最后一行更改为:

然后在orElse上弹出一个新错误:

Optional> 类型中的方法 orElse(capture#4-of ? extends Map.Entry) 不适用于参数 (AbstractMap.SimpleEntry)

据我了解,两个 Map 具有相同的 Key 类型但不同的 Value 类型。每个地图的过滤器也不同。因此,返回的将是一个 Optional,其条目为 String 类型的 Key,但为通用类型的 Value。

我最初的问题是我不知道如何为此 Optional 提供默认值,因为 Entry 的 Value 类型是通用的(我现在仍然不知道答案)。

受@Ole 的启发,我重构了这样的代码:

而我只将过滤后的条目的密钥收集到一个流中,而 JAVA 编译器似乎运行良好。我得到的执行结果为

结果:水果

但似乎我在这里仍然过于复杂......

0 投票
1 回答
396 浏览

java - Java中要传递的参数类型

在 Core Java Volume I Edition 10 的泛型类型的第 8 章中,

注意:超类型边界的另一个常见用途是功能接口的参数类型。例如 Collection 接口有一个方法

default boolean removeIf(Predicate<? super E> filter)

该方法删除所有满足给定谓词的元素。例如,如果您讨厌具有奇怪哈希码的员工,您可以像这样删除它们:

ArrayList<Employee> staff = . . .; Predicate<Object> oddHashCode = obj -> obj.hashCode() %2 != 0; staff.removeIf(oddHashCode);

您希望能够通过 a Predicate<Object>,而不仅仅是 a Predicate<Employee>。超级通配符使这成为可能。

我在试图理解这一点时遇到了一些问题,这<? super E>意味着过滤器可以指向任何可以是超类EmployeeEmployee自身的谓词类型。

上面提到的文本我们可以传递一个Predicate<Object>to Predicate<? super E>

但是如果Predicate<? super E>指向Predicate<Employee>,可以Predicate<Object>传递到Predicate<Employee>吗?

我是不是误会了什么?

0 投票
1 回答
53 浏览

java - 泛型:LowerBounded 通配符与 UpperBounded 通配符

我了解 PECS(生产者扩展,消费者超级)的概念,但仍然对这些符号感到困惑:

  • 即使我已经创建了一个可以接受任何扩展 Object 类的对象的列表,但是当我尝试添加字符串时,它在第 1 行给出了编译时错误。为什么?
  • 在第二种情况下,当我将 List 传递给 printMyList 方法时,它会在第 2 行打印 String 中的每个元素类类型,但是在第 3 行,为什么我无法调用任何 String 类特定的方法,例如charAt。还有为什么不需要对 String 进行强制转换。

同样在消费者的情况下

为什么我不能在 myList 中添加对象。因为如果我们使用 super 这意味着这个列表可以包含等于和高于 Java 类层次结构中的数字的对象。所以 new Object() 应该根据该语句添加到列表中。

谢谢。

0 投票
2 回答
149 浏览

generics - Kotlin 和 Java PECS

所以我的目标是在 Kotlin 中使用与 Java PECS 类似的构造:

当杰克逊在将数据编译到这个变量(列表)之后设置它就可以了。当我尝试从 Kotlin 代码添加项目时,Kotlin 说我只能添加 Nothing(类型)项目。

那么如何在 Kotlin 中放入 MyMarkerInterface 的 List 子项?

0 投票
3 回答
251 浏览

java - 为什么 Comparable 和 Comparator 是 Java 中 PECS 通配符类型的消费者

在Effective Java中,在“使用有界通配符提高API灵活性”项中,在谈到PECS(producer-extends,consumer-super)的使用时,作者提到:

可比较对象始终是消费者,因此您通常应该使用 Comparable<? super T> 优先于 Comparable。比较器也是如此;因此,您通常应该使用 Comparator<? super T> 优先于 Comparator。

我不清楚为什么 Comparables 和 Comparators 被认为是消费者。

在讨论 PECS 的主题之一中,什么是 PECS(生产者扩展消费者超级)?,消费者通常将 Collection 称为某些泛型方法的参数。

而这里的 Comparable 只是一个接口。

任何人都可以分享一些见解吗?谢谢!

0 投票
3 回答
166 浏览

java - 它是如何决定 Predicate “and” 方法在 java 中有一个消费者而不是生产者的?

我正在浏览 Java 8 中引入的 Predicate 类,它是功能接口。Predicate 类内部有一个方法 and ,用于将多个谓词组合为一个。

我已经阅读了 Java 中 PECS 的概念,但仍然不明白为什么在 Predicate 的情况下我们使用? super T. java程序员如何决定它将是消费者而不是生产者。

我的意思是为什么不应该允许出现编译错误的行:

0 投票
1 回答
70 浏览

java - 通配符与类型参数

究竟有什么区别?以及T何时使用什么?

为什么使用类定义?不起作用,但它可以使用List,为什么T使用类定义但不能使用List