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

java - 使用下界通配符 (Java) 的“意外令牌”

我有一些类似的东西:

但 IntelliJ 正在报告:

  1. 错误:(46, 18) java: > 预期
  2. 错误:(46, 19) java: 类型的非法开始
  3. 错误:(46, 26) java: '(' 预期
  4. 错误:(46, 28) java: <标识符> 预期
  5. 错误:(46, 29) java: 'l' 预期
  6. 错误:(46, 43) java: <标识符> 预期

有什么问题?我不允许将名称绑定到下限吗?还是我只允许R&X在上限中使用表达式?

将其更改为

产量

  1. 错误(46、31)java:> 预期
  2. 错误 (46, 32) java: '(' 预期
  3. 错误(46、33)java:类型的非法开始
0 投票
1 回答
238 浏览

java - Java:通用接口,在运行时选择的实例

我有以下简单的界面:

和像这样的实现

SimpleResourceDescriptor和扩展LabelsCommentsResourceDescriptor_

在运行时,我调用该方法

这将返回一个依赖于 ResourceDescriptor 特定实例的 ISimilarityMeasure 实例“sim”。

我还创建了一个数组ResourceDescriptor[] candidates,它将在运行时保存特定 ISimilarityMeasure 对象所需的 ResourceDescriptor 类型的实例。

但是,如果我尝试调用sim.getSim(candidates[0], candidates[1])编译器会告诉我

我使用 eclipse,如果我查看 sim 的可用方法,它会告诉我getSim(null s, null t). 我不明白为什么会这样。编译器是否应该不清楚 getSim 必须期待任何 ResourceDescriptor 并且其中的每个对象candidates都是 ResourceDescriptor 并因此允许调用?如果特定的 ISimilarityMeasure 需要某种类型的 ResourceDescriptor 但被交给了不同的 ResourceDescriptor,那么它在运行时不应该是一个例外吗?

0 投票
2 回答
1014 浏览

java - 在 Java 中使用泛型存储常见的超类型

假设我有一个方法“mix”,它接受两个可能不同类型 T 和 S 的列表,并返回一个包含两者元素的列表。为了类型安全,我想指定返回的 List 是类型 R,其中 R 是 T 和 S 共有的超类型。例如:

要指定这一点,我可以将方法声明为

但是如果我想在mix类上创建一个实例方法而不是静态方法List2<T>呢?

阴影 的<T>实例List2,所以这不好。

解决了阴影问题,但不被编译器接受

被编译器拒绝,因为下界通配符不能存储在命名变量中(仅在? super X表达式中使用)

我可以将参数移动到类本身,例如List2<R, T extends R, S extends R>,但是类型信息在实例级别上确实没有任何业务,因为它仅用于一个方法调用,并且您每次都必须重新转换对象在不同的参数上调用该方法。

据我所知,泛型无法做到这一点。我能做的最好的事情就是返回一个 rawList2并将其投射到调用点,就像在引入泛型之前一样。有人有更好的解决方案吗?

0 投票
1 回答
234 浏览

java - Java - 泛型通配符问题

我的目标很简单。我有一个SetInterface<T>

然后我也有一个ExerciseInterface <T extends SetInterface<?>>

到目前为止,一切都很好。

问题出现在我尝试创建一个包含不同类的通用集合,这些类都实现了练习接口。

我对泛型相当陌生,我一直认为我已经解决了一些问题,但我所做的只是推动错误。

这个问题几乎可以用我的addA()方法addB()来概括

第一个add()给出以下错误..

第二个add()给出了这个错误..

重申一下,我有一个不同类型的 Set 实现的 SetInterface。

我也有不同的练习,这些练习反映了 Sets。例如:

所以我的目标是拥有一个不同练习的集合和一种允许我添加到该集合中的方法。

任何帮助将不胜感激,我已经为此失去了几根头发。

干杯。

编辑:如果这不可行,任何指向更可行方向的指针都将不胜感激。

EDIT2:我将 List 更改为,List <ExerciseInterface<SetInterface<?>>> exerciseList;并且 add() 方法上的错误都消失了。

但是,使用此测试代码..

我正在尝试将 WeightsExercise 添加到锻炼列表中,但我现在收到此错误..

编辑3:扩展ExerciseInterface和SetInterface的示例类(上面的接口中的具体方法也更新)

已解决:此解决方案似乎正确地涵盖了所有内容。

}

0 投票
2 回答
1027 浏览

java - 在 Java 中,如何在泛型类型的实例上调用 getClass 时避免原始类型?

假设我在 Java 中有这个:

最后一个表达式的类型是Class<? extends List>。我明白为什么由于擦除,它不能是Class<? extends List<String>>. 但为什么不能呢Class<? extends List<?>>

如果我想将此表达式的结果分配给以某种方式保留此类实际上是某种信息的变量,我是否无法避免未经检查的强制转换警告原始类型警告List

0 投票
1 回答
1545 浏览

java - 有界通配符相关的编译器错误

我想知道这段代码有什么问题:

编译器抱怨错误消息:

类型不匹配:无法转换Set<Map.Entry<capture#1-of ? extends String,capture#2-of ? extends Integer>>Set<Map.Entry<? extends String,? extends Integer>>

类型应该s是什么?Eclipse 建议Set<?>,但我试图获得比这更具体的。

0 投票
2 回答
725 浏览

java - Java 通配符读写权限

在学习 Java 通配符时,我发现自己对这个主题有误解,所以。

  1. Upper Bound允许我只读泛型类的成员
  2. Lower Bound允许我写信给成员,但前提是它是类型下限

编译器不会让我们在这里写任何东西,因为他不能确保 list 的元素是正确的类型(供以后阅读)。

发生这种情况是因为编译器可以确保最低类型始终是 Car。然后我们只能通过Car。我对吗?

0 投票
1 回答
122 浏览

java - 为什么这种带有通配符的方法有效?

我遇到了这个问题:

我们得到了一个地图界面:

我们要实现一个方法addToMyMap,其签名是(我们需要填写缺失的部分(点):

该方法将扫描键列表,并且对于每个键,如果它在地图中不存在,它将使用 newValue 作为值添加它。

作为答案给出的实现如下:

我不完全确定为什么这个实现是正确的。containsKey如果该方法获得 K 的子类,该方法如何工作?这不就像Apple在 a 中搜索List<Fruit>吗?您甚至会如何遍历该列表?

put方法也是如此:它如何迭代具有许多不同类型的地图?

这可能与 Map 的实现有关。

所以也许真正的问题是包含许多 K 和 V 超类型的映射如何知道迭代 K。

调用此方法的示例是:

这个包含浮点数和整数的映射如何查找浮点类型的键(在 put 和 containsKey 中)?

我会很感激一些解释。

0 投票
1 回答
243 浏览

java - 嵌套有界通配符

当我尝试编译以下代码时:

我收到不兼容的类型错误:

我怎样才能实现一个LinkedList包含List与扩展元素是 s 的元素Number

需要明确的是,我希望以numList下列方式添加列表:

numList.add(new LinkedList<Integer>());

0 投票
4 回答
1185 浏览

java - java中的通配符通用和含义,下限或上限

所以我正在阅读通用方法,我很困惑。我先在这里说明问题:

在此示例中:假设我需要一个适用于任何类型 T 的 selectionSort 版本,方法是使用调用者提供的外部可比较。

第一次尝试:

假设我有:

  • 定义的车辆类别
  • 创建了实现 Comparator 的 VehicleComparator,同时按价格比较车辆。
  • 创建卡车扩展车辆
  • 实例化 Truck[] arr ; 车辆比较器 myComparator

现在,我这样做:

并且它不起作用,因为 myComparator 不适用于任何 Vehicle 子类。

然后,我这样做:

这个声明会起作用,但我不完全确定我一直在做什么......我知道使用是要走的路。如果“?super T”的意思是“T的未知超类型”,那么我是在施加上限还是下限?为什么超级棒?我的意图是让 T 的任何子类使用 myComparator,为什么是“?super T”。如此困惑...如果您对此有任何见解,我将不胜感激。

提前谢谢!