问题标签 [bounded-wildcard]

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 投票
2 回答
214 浏览

java - 当类具有有界类型参数时使用有界通配符

假设我有一堂课

以及D具有两个扩展它的类的类:Band C,例如

现在,在某个地方,假设我想要一个A's 数组,无论是B-kind 还是C-kind。(例如,将类中的函数应用于D数组中的所有项目。)

然后我应该再次限制类型吗?

换句话说:这些选项中的哪一个是可以选择的?

  1. A<?>[] re;

  2. A<? extends D>[] re;

哪一个是最佳实践?

0 投票
4 回答
214 浏览

java - 未根据上限类型参数检查下限通配符

我想知道为什么这段代码编译成功?

源代码:

编译成功

它是如何工作的,为什么会编译?M是任意类型,为什么可以使用呢?应该是:<M extends Number>?这不会编译:

错误信息:

类型参数 M 不在类型变量 K 的范围内,其中 M、K 是类型变量: M 扩展在方法 useMe(A) 中声明的对象 K 扩展在类 A 中声明的数字

有什么区别?

0 投票
2 回答
1354 浏览

java - 为什么三元运算符不喜欢有界通配符的泛型类型?

0 投票
2 回答
89 浏览

java - 需要泛型转换解释

以下是使用泛型扩展基类型的两种形式:

我不明白。有什么区别?这两种方法似乎都返回相同的扩展 Runnable 对象的 BlockingQueue。

0 投票
3 回答
700 浏览

java - 如何测试泛型列表是否包含Java中子类型的确切子集合?

我有一个抽象类 AbstractService 和几个扩展这个抽象类的类:

愚蠢的类图

然后我有一个 ServiceFactory 根据我传递的参数返回一个包含一些服务的通用列表:

在我的 UnitTest 中,我想验证我的服务列表是否正好包含 3 个 AService 子类型。我现在这样做的方式是:

当 actualServices 包含少于 3 个 Aservice 时,测试正确失败。这个解决方案唯一的问题是如果actualServices包含超过3个AService,测试通过...

有没有一种方法可以做到这一点,或者我应该使用循环自己实现它?

0 投票
3 回答
490 浏览

java - 从抽象泛型到非抽象非泛型

我最近一直在从事一个使用通用最佳搜索算法的 Java 项目。为了使算法本身通用,我在算法中使用的所有类上使用了一堆泛型。

这是所有的类/接口声明:

现在理论上,所有这些都可以正常工作。但是,当我应用算法时,我计划将“E”作为某种游戏状态(比如棋盘、纸牌游戏、探路者、你有什么)。因此,我创建了以下类:

我对这个特定设置的意图是让 GameState 成为代表特定游戏状态的字符串的容器。但是,这会导致尝试使用以下代码创建 StateSearch 时出现问题:

我最终得到一个绑定不匹配错误,指出这GameState不是<E extends AbstractState<E>>. 现在,我相信我明白为什么会这样了。我的想法是因为GameStateextends AbstractState<String>,而不是AbstractState<E>

不幸的是,我不希望我的GameState类有一个通用类型。它旨在实现实际做某事,因此从泛型切换到字符串。例如,我可能想GameState在一个完全不同的项目中创建一个类,该项目使用整数来实现它。

鉴于我在类中使用和执行的方法、变量和操作GameState,它不能是通用的。

毕竟我的问题是:有没有办法将我的GameState类实现为非泛型类,以满足我的类提出的边界要求StateSearch

我不介意是否必须更改某些类声明。关键是我需要 Algorithm 是Generic,并且 Implementation 是Non-GenericGameState班级需要成为我在两者之间过渡的点。


编辑:
我需要GameState类作为某个游戏的实现。和接口旨在让我无需实际实现即可构建状态搜索算法AbstractStateState以这种方式进行设置允许我在多个游戏中应用此设置。

该类StateSearch基本上只是将状态从我的 中拉出StateQueue,这只是一个AbstractState按优先级系统排序的类向量(因此是 Comparable 实现)。扩展状态树的方式是使用类中的getNextState()函数AbstractState。这很好,但该getNextState()函数基本上是从我的getSuccessors()函数中获取最佳状态,该状态只能GameStateClass 中定义。在其他地方,它只是抽象的。

我无法getSuccessors()以通用方式定义函数,因为它纯粹基于实现。此函数旨在从当前状态返回所有可能的状态。例如,如果游戏是井字游戏,该getSuccessors()函数将返回一个游戏状态列表,其中每个状态代表一个可能的移动。

该类GameState还包含 a getEstimatedCost()getRunningCost()它基本上分别充当h(x)g(x)函数。这也只能GameState类中定义,因为两者都取决于实现。

0 投票
2 回答
1852 浏览

java - java泛型中的有界通配符

我正在Core Java volume-1 by Horstmann, Cay.S阅读generics。我无法理解教科书的一些解释。我给出了作者引用的示例代码。其次是书中的文字和我的问题。

从书中:

"""没有损坏是可能的。调用setFirst是一个type error。要了解原因,让我们仔细看看 type Pair<? extends Employee>。它的方法如下所示:

这使得无法调用该setFirst方法。compiler唯一知道它需要一些subtype,但Employees它不知道是哪种类型。它拒绝pass any specific type——毕竟 ?可能不匹配它。"""

问题:我不明白为什么它拒绝传递任何特定类型。那么这个方法接受什么? ? extends Employee-- 表示包括 Employee 和 Employee 的任何子类型。所以通过员工应该是合法的吗?

从书中:

编译器不知道该setFirst方法的确切类型,因此不能用 type 的对象调用它Employee or Object,而只能用Managersubtypeas来调用它executive

问题:所以在这里我说该方法可以接受任何 Manager 对象或扩展 Manager 对象(类似于上面绑定的 subytpe)。我不清楚为什么?

从书中:

Intuitively speaking, wildcards with supertype bounds let you write to a generic object, while wildcards with subtype bounds let you read from a generic object.

问题:我根本无法遵循它。听上去很简单,但不符合逻辑的意思。

0 投票
1 回答
319 浏览

java - Java构造函数中的泛型?

考虑这个假设的课程(我在一个在线视频中找到):

Contrived这里可以接受的类型变量是Number或者一些子类型Number。但是类本身继承自ArrayList,所以无论类获得什么类型,都将决定ArrayList.

现在有一个字段叫做values,就是List<? extends T values>。那么这意味着什么?是否list可以容纳任何延伸的东西T(进而延伸Number)。

PECS (producer extends, consumer super)按照规则,我可以只用它来List读取元素而不是添加到list.

constructor如果我需要通过 a ,看起来会怎样list of doubles or some type T

0 投票
1 回答
261 浏览

java - 在接口上使用通配符

考虑以下类:

以下代码正常工作:

但是,以下代码不起作用:

我知道它不起作用,因为它应该只能添加 to的一个具体子类型,但是它是怎么来的,下面的代码也不起作用?Notifiableset2

也许更有趣的是,为什么以下工作?

0 投票
2 回答
18995 浏览

java - Java 嵌套泛型类型

为什么必须使用泛型类型Map<?, ? extends List<?>>而不是更简单Map<?, List<?>>的以下test()方法?

请注意以下工作,并且这三种方法无论如何都具有相同的擦除类型。