问题标签 [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 投票
6 回答
2289 浏览

java - Java泛型:在集合中添加错误的类型

谁能解释一下?

我有这几节课:

这是行动:

此示例编译没有错误,输出为:

但是我怎样才能添加猫狗列表?猫是怎么变成狗的?

我使用:java版本“1.6.0_24”。OpenJDK 运行时环境 (IcedTea6 1.11.1) (6b24-1.11.1-4ubuntu3)

0 投票
2 回答
190 浏览

java - Java 泛型 - 通配符

我是 Java 新手,并且已经让自己陷入了一种情况,很明显我误解了它如何处理泛型,但是阅读教程和搜索 stackoverflow 并没有(至少到目前为止)让我更加清楚我怀疑我在滥用通配符。作为提醒,我有 C++ 背景,所以它如何处理模板可能会影响我处理这个问题的方式。

这是我使用代表性类继承的基本结构

这似乎都是正确的(或者至少 eclipse 没有抱怨),当我尝试使用它们时似乎出现了问题。我的第一次尝试是:

并导致原始类型的警告。于是我试了...

但这会导致错误

PacketParser> 类型中的方法 parse(capture#9-of ? extends Packet) 不适用于参数 (Packet)

在这一点上,我已经决定我误解泛型是如何工作的,所以我求助于 stackoverflow,希望能指出我出错的地方,并可能为我指明正确的方向。

0 投票
1 回答
131 浏览

java - 定义功能性 Java API 时,通用通配符的正确用法是什么?

我正在编写函数式静态辅助方法,充当通用抽象的运算符(例如Iterable<T>),我对何时应该使用通配符感到有些困惑。在以下情况下,正确、最安全和最简单的方法签名是什么,为什么?

  • 检查属性:

public static int size(Iterable<?> source)

对比

public static <T> int size(Iterable<T> source)

  • 转型:

public static <T> Iterable<T> take(Iterable<T> source, int count)

对比

public static <T> Iterable<T> take(Iterable<? extends T> source, int count)

  • 结合:

public static boolean elementsEqual(Iterable<?> first, Iterable<?> second)

对比

public static <T> boolean elementsEqual(Iterable<T> first, Iterable<T> second)

对比

public static <T> boolean elementsEqual(Iterable<? extends T> first, Iterable<? extends T> second)

0 投票
4 回答
182 浏览

java - 协变结构因 Java 中的错误捕获而失败

考虑以下 Java 类定义:

Cage在为s定义协变时,Animal我在 Java 中使用以下代码:

但是下面的 Java 示例...

...无法编译并出现以下错误:

Cage 类型中的方法 add(capture#2-of ? extends Animal) 不适用于参数(Lion)

这样做是因为否则Tiger可能会在运行后添加不同的类型animals = lions并在运行时失败?

如果只有一个子类型,是否可以制定一个不会拒绝它的特殊(假设)规则Animal

(我知道我可以将add'sT替换为Animal。)

0 投票
1 回答
683 浏览

java - 具有最终上限的通配符

Class<? extends Integer>可以正常编译,但是Integer是最终类型,因此将其用作上限是没有意义的(什么都不会extend)。

如果您尝试使用最终类型作为类型参数的上限,您将收到编译器警告:

类型参数 T 不应受最终类型 Integer 的限制。最终类型无法进一步扩展

为什么使用最终类型作为通配符的上限完全没问题,但会为类型参数抛出警告?为什么 Java 甚至允许通配符以最终的大写类型为界?

0 投票
1 回答
2141 浏览

java - 在通配符类型 ArrayList 中添加元素

我正在尝试在列表类型参数是扩展问题的通配符的列表中添加一个元素

其中标识是问题的子类。问题是一个抽象类。

它给了我这个错误

在线#1Cannot instantiate the type ArrayList<? extends Question>

在第 2 行

为什么会显示这样的错误?是什么原因造成的?我将如何解决它?

0 投票
2 回答
8042 浏览

java - 无法在泛型中实例化类型

我有这门课

我正在尝试使用这个从这个类中创建一个变量

它给了我这个错误

0 投票
4 回答
774 浏览

java - 多个通配符边界

假设我有以下课程:

Either是一种存储类型 A 或 B 的一个对象的类型。 get()检索该对象。

问题是是否可以使用泛型来改变 的方法签名,get()以便返回的类型不仅仅是Object,而是 A 和 B 的任何常见超类型。例如,anEither<Integer, Long>可以有get()return Number,anEither<Deque<T>, Set<T>>可以有get()returnIterable<T>Collection<T>,等等。(显然, anEither<Foo,Foo>应该有get()return Foo)。

如果这是可能的,如果我有,可以返回Either<List<A>, List<B>>的最具体的类型是什么?get()它是 raw List, wildcardList<?>还是完全其他的东西?

0 投票
2 回答
126 浏览

java - 为什么 synchronizedCollection() 静态工厂方法的输入参数中没有有界通配符?

我正在阅读 Java 教程,偶然发现了一些我不理解的东西。在 Collections 线索中,他们谈论Wrapper 实现,我注意到两个静态工厂方法 -

我想知道为什么同步包装器不使用有界通配符?ie 为什么synchronizedCollection的签名不是如下?

0 投票
1 回答
299 浏览

java - 具有下界通配符的泛型

Mixer<? super Dog>如果用下界通配符定义,则返回参数如此

为什么当我返回 aMixer<Object>并且没有编译器错误时会出现编译器错误Mixer<Animal>