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

java - 泛型方法和通配符

以下三个签名有什么区别?


我知道泛型中的含义extendssuper含义。foo我的问题是,bar和之间是否有区别baz。我应该使其中一个参数不变,而另一个参数在适当的方向上变体,还是应该使它们都变体?这有什么不同吗?

0 投票
2 回答
3518 浏览

java - (Java)如何使用有界通配符泛型实现接口方法?

我维护了 2 个具有相同功能的项目,并将此功能整合到一个公共项目中。我定义了一个接口:

我在两个项目中都实现了这个接口:

Shape是 的子类型ShapeData。当我编译这个类时,我收到一个关于强制转换的错误List<Shape>如何List<? of...解决这个编译错误?也许更好的问题是,我应该使用有界通配符(即?扩展)定义我的接口方法吗?

0 投票
4 回答
17272 浏览

java - Java 泛型:有界类型参数中的多重继承

我即将创建一个工厂,它创建特定类型 T 的对象,它扩展了特定类 A 和另一个接口 I。但是,T 一定是未知的。以下是最低限度的声明:

这是工厂方法:

这编译得很好。

当我尝试使用该方法时,以下工作正常:

...虽然这不是:

编译器抱怨:

绑定不匹配:F 类型的泛型方法 newThing() 不适用于参数 ()。推断类型 I&A 不是有界参数的有效替代品

我不明白为什么。明确指出“newThing 返回某种类型 T 的东西,它确实扩展了类 A 并实现了接口 I”。当分配给 A 时一切正常(因为 T 扩展了 A)但分配给 I 却没有(因为什么?,显然返回的东西既是A是 I)

另外:当返回一个对象时,比如说 B 类型class B extends A implements I,我需要将它转换为返回类型 T,尽管 B 匹配边界:

但是,编译器不会抛出 UncheckedCast 之类的任何警告。

因此我的问题是:

  • 这里出了什么问题?
  • 是否有一种简单的方法来实现所需的行为(即分配给静态类型 A 或 I 的变量),就像在工厂方法中通过强制转换解决返回类型问题一样?
  • 为什么分配给 A 有效,而分配给 I 无效?

--

编辑:这里是完全使用 Eclipse 3.7 工作的完整代码片段,为 JDK 6 设置项目:

编辑:这是一个完整的示例,其中包含在运行时有效的方法和调用:

0 投票
3 回答
997 浏览

java - 类型 安全警告

在 Maurice Naftalin、Philip Wadler 所著的 Java 泛型和集合一书中,我经历了泛型的限制并提出了疑问。可能是书里回答了这个问题,但我想我很困惑。
在以下代码中:

正如书中所说,嵌套通配符实例化没有问题,因为对于第一个 list ,它知道它将包含列表类型的对象。

但是我尝试修改上面的代码并提出了一个警告和一个编译时错误。我试着做:

我的问题是:1)在第一行,如果我写:

如果我写的话,这里不会发出警告,但正如上一个块中所写:

发出警告。为什么?

2)为什么第四行出现编译时错误:

提前致谢。

0 投票
2 回答
145 浏览

java - 带有泛型堆栈数组的 JAVA 通配符捕获错误

这就是制作堆栈数组的代码。我将它们放在一个数组中的原因是因为它是分配的要求之一。该程序在没有数组的情况下工作。

此外,堆栈采用泛型,因为我必须创建自己的堆栈(也是分配的要求)。

此代码从文本文件中获取信息并将对象推入堆栈。

我收到一条错误消息:

我创建的所有类都会重复此错误。

注释掉的部分是之前我为每个对象创建一个堆栈时工作的代码。

将所有内容都推入堆栈后,我无法将所有内容都放入数组中,因为不必要的中间变量将取出点。

0 投票
3 回答
195 浏览

java - 为什么通用类和方法声明中不能使用通配符?

像这样的声明:

是允许的。而这样的声明是不允许的。

关于为什么 Java 限制我们这样做,有什么合乎逻辑的解释吗?

& 两者之间的实际区别是什么

0 投票
1 回答
128 浏览

java - 是否可以编写一个接受不同抽象的通用参数的方法?

作为这个问题的后续,是否可以编写一个将 a 添加Dog到合适房间的方法?(在这个例子中,它会接受一个Animal房间或一个Dog房间。)或者我是否被迫编写如下两种不同的方法?(由于类型擦除,我什至不能依赖重载)。

0 投票
1 回答
213 浏览

java - 自引用类型和有界通配符之间的不良交互

这个案例似乎是另一个 Eclipse 的 Java 编译器碾压 javac 的案例。对我来说唯一的问题是它是 JLS 还是 javac 中的错误。

第二行在 Eclipse 中编译,但在 javac 中编译失败,并显示“类型参数 FC 不在其范围内”的消息。

FC 被声明为扩展 EndoFunctor< ? 扩展 C, FC >,并且对 FC 的限制是它为推断的 D 扩展 EndoFunctor< D, FC >,在这种情况下是?扩展 C。我认为 javac 没有意识到通配符在两种情况下都表示相同的未知类型。不过,Eclipse 可以!

显然,以下解决了 javac 中的问题:

但对于该接口,这是一个比我想要的更宽松的定义。

我也可以试试

但这种方法迫使我将额外的类型参数 D 带到任何地方。

该怎么办?

0 投票
2 回答
841 浏览

java - 如何使用通配符将泛型传递给函数而不进行强制转换?

这是我的问题:我在 A 类中的函数:

我的电话:

我不认为这很干净。有没有办法在不放弃函数中使用通配符的情况下避免强制转换?

0 投票
1 回答
174 浏览

java - 泛型通配符正确使用

我有一个对象定义如下:

我尝试插入一个看起来符合通配符的对象

编译器抛出一个错误,上面写着:

类型中的方法put(String, capture#18-of ? extends List<? extends LightGeometry>)Map<String,capture#18-of ? extends List<? extends LightGeometry>>不适用于参数(String, ArrayList<LightGeometry>)

我错过了什么?

编辑:为什么我将通配符与泛型类型一起使用 它基本上归结为能够将列表(我通过服务获得)分配给geoms另一个类中的对象,而不必筛选列表进行转换.

如果我要使geoms变量 aMap<String, List<LightGeometry>>那么我得到一个转换错误,说我不能将 a 分配Map<String,ArrayList<LightPolygon>>给一个 'Map>`