问题标签 [unbounded-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 投票
5 回答
1497 浏览

java - 具有可选多个边界的泛型,例如 List

我有一个方法,它应该只接受Map其键的类型String和值的类型Integer or String,但不接受,比如说,Boolean

例如,

不能如下声明 Map(以强制编译时检查)。

unbounded wildcard除了将值类型声明为 an并在运行时验证Integer或在运行时验证之外,最好的选择是什么String

此方法接受一组属性来配置底层服务实体。String实体支持类型和Integer单独的属性值。例如,一个属性maxLength=2有效,defaultTimezone=UTC也有效,但allowDuplicate=false无效。

0 投票
1 回答
240 浏览

java - 如何在通用通配符映射中添加一些值

我已经解决了几个相关的问题,但这些问题并没有帮助我。实际上,我有一个返回类型为的方法Map<?,?>,我想使用 Mockito 进行单元测试。示例代码是:

我想模拟一下:

模拟代码是:

如果我返回带有 String 的普通 Map 的值,那么它会抛出编译时错误,但 null 除外(根据文档)。

但我想添加一些像 String 这样的数据,以便在获取模拟地图数据后我可以做进一步的工作。

0 投票
1 回答
1806 浏览

java - 带有通配符的列表上的 AssertJ `containsExactly` 断言

我有一个 getter 返回一个带有通配符的列表:

Bar另一个接口在哪里。

当我像这样用 AssertJ 编写断言时:

编辑:我的完整用法是链接 ausingElementComparator并提供 aComparator<Bar>来比较预期的Bar实例。

我得到这个编译错误:

ListAssert 类型中的 containsExactly(capture#46-of ? extends Bar...) 方法不适用于参数 (Bar, Bar)


我的第一个解决方案是转换结果:

然后我收到一个警告:

类型安全:从列表到列表的未经检查的转换

可以使用 删除警告@SuppressWarnings("unchecked"),但中间的强制转换仍然不会使断言真正可读。


我的第二个解决方案是指示 ELEMENT 通用参数的值:

好一点,但也不是很好(不能静态导入,行首不利于可读性)


我想我正在寻找另assertThat一种列表方法,其中类类型可以指定为第二个参数:

这样我应该能够写出这样的东西:

0 投票
2 回答
134 浏览

java - 为什么是简单的“捕获?” 不编译甚至可以在编译时推断出类型安全?

0 投票
1 回答
367 浏览

java - Java - 从无界通配符转换为字符串

所以,起初我有一句话说:

但是,由于泛型类型信息在运行时被删除,我不能指定它是 aSet<String>而是 unbounded wildcard Set<?>。但是我需要将此集合用于与字符串相关的处理,例如附加到 JTextArea,因此当我需要字符串出来时,这种无界通配符类型不是很有用。

所以,我试过这个

Set<String>这种转换将它从无界转换为字符串类型(如果输入是 a ,我相信它会是Set)但这不是很安全,是吗?我收到一条错误消息,说我可以压制未经检查的演员表,但我觉得可能有另一种方法可以解决这个问题。有任何想法吗?

编辑:input通过从私有 LAN ip 上的服务器套接字的输入流序列化来初始化。

0 投票
1 回答
283 浏览

java - 使用通配符转换常量泛型

我正在做静态 util 方法,它返回带有空可选的完整未来:

为了提高效率,我想返回相同的已完成常量实例CompletableFuture- EMPTY_FUTCompletableFuture<Optional<T>> ,但由于无界通配符而无法将其转换为。

当然我想为任何类型调用这个完成的未来方法,与Optional.empty()CompletableFuture.completedFuture(U)几乎相同

如何将具有无界通配符的泛型转换为特定类型?有可能吗?

0 投票
0 回答
97 浏览

java - 方法调用中通配符的奇怪行为

我正在研究Java中的通配符主题,我被困在下面的代码中

如果您通过此代码调用这些方法,则会出现错误,这是可以理解的

但是,如果您通过添加一个额外的 arg 来更改这些方法的签名,就像这样

并打电话给他们

为什么只是通过添加一个额外的参数来实现这种行为?为什么有界列表仅通过添加一个 xtra arg 就可以接受无界列表?

0 投票
0 回答
41 浏览

java - Java无界通配符误区

假设我定义了一组参数化类型,如下所示:

为什么将该引用传递给签名中具有无界通配符的方法是错误的,如下所示:

0 投票
1 回答
297 浏览

scala - 使用运行时配置使参数化的 ScalaCache 通用

包含该问题的 git 存储库可以在这里找到https://github.com/mdedetrich/scalacache-example

我目前遇到的问题是我试图让我的 ScalaCache 后端不可知,它可以在运行时使用类型安全配置进行配置。

我遇到的问题是 ScalaCache 参数化了缓存的构造函数,即构建一个你会做的咖啡因缓存

ScalaCache(CaffeineCache())

至于SentinelRedisCache你会在哪里做

ScalaCache(SentinelRedisCache("", Set.empty, ""))

就我而言,我创建了一个通用缓存包装器MyCache,如下所示

我们需要随身携带,CacheRepr因为这就是 ScalaCache 知道如何序列化任何类型的方式TCaffeineCache使用 a CacheReprwhich is InMemoryReprwhere asSentinelRedisCache使用 a CacheReprwhich is Array[Byte]

这就是问题的症结所在,我有一个Config只存储正在使用的缓存的地方,即

它 a 的原因Cache[_]是因为在编译时我们不知道正在使用什么缓存,ApplicationConfig将在运行时使用CaffeineCache/实例化SentinelRedisCache

这就是问题的症结所在,Codec如果我们只是将我们applicationConfig.cache作为构造函数,Scala 无法找到通配符类型的隐式,即https://github.com/mdedetrich/scalacache-example/blob/master/src /main/scala/Main.scala#L17

如果我们取消注释上面的行,我们得到

有谁知道如何解决这个问题,本质上我想在我的ApplicationConfig, 缓存中指定类型Cache[InMemoryRepr | Array[Byte]]而不是仅仅Cache[_](以便 Scala 编译器知道查找任何一个的隐含InMemoryRepr or Array[Byte]MyCache定义类似这样的内容

0 投票
3 回答
135 浏览

java - java中的通配符和类型参数范围

考虑这种情况:

据我了解类型界限,在这种情况下,两者的有效上限TEis class A。所以问题是:为什么 javac 在声明字段时不接受类 A 作为参数b,但wildcard ? extends A在声明字段时接受b2