问题标签 [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.
java - Java:有界通配符或有界类型参数?
最近看了这篇文章:http: //download.oracle.com/javase/tutorial/extra/generics/wildcards.html
我的问题是,而不是创建这样的方法:
我可以创建这样的方法,并且效果很好:
我应该使用哪种方式?通配符在这种情况下有用吗?
java - 原始类型、无界通配符和有界通配符
我有一个简单的问题如下:这是一个关于整个问题的简单示例:
根据 khalid mughal 的 Java SCJP(一本非常好的书!):
我确实理解任何原始类型(示例 a)在分配给任何有界通配符引用时,都会出现未经检查的警告(因为该原始类型 a 中的内容可以是任何东西)。
我的问题是因为 c 是最高上限(?扩展对象),不应该在没有警告的情况下将 a 分配给 c 吗?
java - Java 泛型和有界类型
我有一个 ConcurrentMap 的包装类,如下所示:
标记的行会触发以下编译错误:
我怀疑无界通配符是罪魁祸首,但我无法更改方法签名,因为它是从 ConcurrentMap 接口继承的。有任何想法吗?
java - java有界通配符泛型的编译器错误
具有以下代码:
我在最后两行得到编译错误,但虽然我已经考虑过它,但我不明白为什么会出现编译错误。
当我评论最后一行时,我仍然得到上述编译错误,但据我了解,编译器应该能够从这些行中推断出正确的类型(堆栈)。
非常感谢
java - 为什么在有界通配符泛型中不能有多个接口?
我知道 Java 的泛型类型有各种违反直觉的属性。特别是我不明白的一个,我希望有人可以向我解释。为类或接口指定类型参数时,您可以对其进行绑定,使其必须使用public class Foo<T extends InterfaceA & InterfaceB>
. 但是,如果您要实例化一个实际对象,这将不再起作用。List<? extends InterfaceA>
很好,但List<? extends InterfaceA & InterfaceB>
无法编译。考虑以下完整的片段:
似乎bar
应该明确定义的语义——我想不出任何类型安全性的损失,因为允许两种类型的交集而不仅仅是一种。不过我敢肯定有一个解释。有谁知道它是什么?
java - Mockito:使用有界通配符返回类型的存根方法
考虑这段代码:
编译器抱怨试图为dummyMethod()
. 关于如何处理返回具有有界通配符类型的存根方法的任何指针?
java - 通用:ArrayList 的?在 Java 中扩展 ISomeInterface
我在下面的代码中遇到了一些麻烦。
这将为“returnedEvents.add(new GoogleEvent()); line of code”返回以下编译错误:
ArrayList 类型中的方法 add(capture#1-of ? extends IEvent) 不适用于参数 (GoogleEvent)
类的声明GoogleEvent
如下:
我知道在 Java 中使用泛型有一些棘手的部分,因此是通配符,但我似乎无法弄清楚这一点。
谢谢。
java - java.lang.Class的getInterfaces()方法为什么返回Class []而不是Class []?
(为了澄清问题,“T”指的是在 Class 中声明的类型参数)
仅作为示例,请查看以下应用程序:
输出是预期的:
因此,基于上面的这个例子,我们可以看到编译器识别出 InterfaceA确实满足 wildcard 的边界,所有其他接口也是如此。
直觉上,我希望以下内容是安全的,但事实并非如此:
编译器发出警告,因为签名说它返回 Class;但是,Class 的 javadoc 声明如下:
如果此对象表示一个类,则返回值是一个数组,其中包含表示该类实现的所有接口的对象。
在我们的例子中,“这个对象”指的是ClassA
。基于此声明,如果我们调用:
那么我们从逻辑上知道,Class<?>
返回数组中的每个都将包含对超类型的引用ClassA
。
作为一个额外的参考点:
来自 Java 语言参考,第三版:
一个类必须实现其直接超类和直接超接口所做的所有接口。这种(多个)接口继承允许对象在不共享任何实现的情况下支持(多个)公共行为。
阅读规范的这个部分和其他部分,我认为任何由类实现或扩展的类或接口T
都会落入 bounds <? super T>
。
编辑:
有人认为我的问题没有具体的理由。我将提供一个例子:
问题出在第 15 行。您必须强制转换<? super W>
才能获得正确的类型。编译器警告可以被抑制,但它是否合理?是否存在这种演员表不正确的情况?
java - Java泛型方法:super不能用?
所以我有这个方法:
我想返回集合而不是使用 void 方法:
意图做这样的事情(在哪里MyItemClass extends MyItemBaseClass
):
但我得到一个语法错误super
:
令牌“super”的语法错误,预期
是什么赋予了?我可以解决这个问题吗?
java - 关于通用有界通配符类型的困惑
非常琐碎的Java问题。此代码有一个错误:
修复它的正确方法是什么?
的想法T
基本上只是一种类的层次结构根,所以给定这样的层次结构:
one 将T
设置为Entity
并getEditorFor(T obj)
负责返回Editor<X>
whereX
取决于obj
的具体类型,并且始终为 Is-A T
。所以,如果你有SubTypeDependentEditor<Entity>
,getEditorFor(T obj)
返回Editor<EntityA>
when obj
isEntityA
和Editor<EntityB>
when obj
is EntityB
。
这有没有可能在没有警告的情况下实施?
更新:
基本上可以有任何其他签名,但实现该代码的代码只有对象是Editor<X>
,所以如果这个方法返回Editor<T>
我不知道如何实现getEditorFor(T obj)
。