问题标签 [type-bounds]

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 投票
2 回答
1834 浏览

generics - 如何在 TypeScript 中设置类型参数的下限?

在 TypeScript(我的版本:2.1.1)中,可以为类型参数设置一个上限,如下所示:

如何设置下限A?以下代码不起作用:

会导致编译错误。

TypeScript 存储库的 GitHub 问题#13337中的人建议使用

Y与下界X。但这不包括我的情况,其中X是实际类型而不是类型参数。

关于如何降低类型参数的任何想法?

0 投票
2 回答
1041 浏览

syntax - 特征中的“where”子句有什么作用?

如果我有这个代码:

where子句实际上做了什么?

天真地,我在想where Self: Sized;关于类型实现的一些规定Trait,比如'如果你Trait为类型实现A你的类型A必须调整大小,即它可以是i32但不是[i32]

但是,这样的约束宁愿去trait Trait: Sized(如果我错了,请纠正我)?

现在我注意到where Self: Sized;实际上决定了我是否可以调用fg从内部调用object_safety_dynamic

我的问题:

  1. 幕后发生了什么?

  2. 我实际上是在告诉编译器什么(用简单的英语)where Self: Sized;可以g()工作,但f()不是?

  3. 特别是:由于无论如何都是参考,因此各种(大小或未调整的)类型&self之间存在什么编译差异。它不会总是归结为类似的东西,无论类型是否调整大小?fg_vtable_f_or_g(*self) -> i32where

  4. 为什么我可以同时实现 Traitu8[u8]. 编译器实际上不应该阻止我实现f()for [u8],而不是在调用站点抛出错误吗?

0 投票
2 回答
172 浏览

java - Java 泛型 - 不在界限内

我有以下无法编译和生成的示例Error:() java: type argument GroupOfPartsDecorImpl<V> is not within bounds of type-variable GOP。代码如下:

既然 GOP 是GOP extends GroupOfParts<V, PartDecorator<V, ? extends Part<V>>>并且 GroupOfPartsDecorImpl 应该是到底GroupOfParts<V, PartDecorator<V, Part<V>>为什么会出现这个错误?

0 投票
2 回答
342 浏览

scala - 在 Scala 中编写具有 ClassTag 和 AnyRef 约束的通用函数

阿帕奇SparkContext有一个方法:

我正在尝试编写一个分析数据的包装器(现在它只是尝试记录大小)并调用原始方法:

org.apache.spark.util.SizeEstimator期望一个AnyRef,所以我得到一个错误。我对 Scala 不是特别有经验,所以ClassTag-s 对我来说有点黑魔法。

如何修复这段代码,以便sc.broadcast(期望ClassTag)和SizeEstimator.estimate(期望AnyRef)都满意?

0 投票
1 回答
109 浏览

scala - 找不到具有下限类型界限的方法参数的隐式转换

我有这个代码:

斯卡拉小提琴

编译期间注释行失败:

有没有办法让它在不指定类型参数或像前两行那样显式使用转换函数的情况下编译?

0 投票
1 回答
171 浏览

fortran - 在类型绑定的基本过程中将对象作为意图(输入输出)传递

无论此附加文本的形状如何,我都想将文本添加到标量对象的组件中。

为了尝试这个,我创建了一个基本过程,它有一个基本输入参数,但只有一个intent(inout)参数是传递的对象。

这是一个MWE:

如果我让注释行call testA%add( ['toto','abcc','d,ef'] ),它工作正常。但是如果我取消注释,我会在编译过程中出错

错误:ELEMENTAL 子例程“add”的 INTENT(INOUT) 虚拟“objA”在 (1) 处的实际参数是标量,但另一个实际参数是数组`

我理解为什么testA%write调用是正确的,这是由于intent(in)传递的对象;在这种情况下,编译器知道一个参数是标量形状,另一个是数组形状。

对于testA%add( ['toto','abcc','d,ef'] ),我也知道它需要一个形状obj_A为的数组intent(inout),因为输入的文本是一个标量。因此,这不是正确的做法。

obj_A%Message无论文本的形状如何,是否有正确的方法添加文本?

0 投票
1 回答
102 浏览

scala - Scala 多态性 - 协变和类型绑定

使用 Scala ...我无法弄清楚如何以混合类型绑定和协变的方式使用多态性。

简而言之,我认为我需要类似这种类型签名的东西......但是如果你按照我的虚拟示例进行操作,你就会明白我为什么会来到这里......也许我错了。

但这种方法会产生......

这是一个虚拟示例,它演示了我正在尝试做的事情...我可以通过仅使用基本特征 Record 来回避这个问题...但我想让它与出于其他原因的多态性一起工作真正的代码。

设置

多态函数

注意 - 从 Iterator 到 Seq 这里看起来有问题......我正在从 src/main/resources 读取一个文件......它作为一个 Iterator 进来......我最终需要将它放入一个 Map 中,所以.toSeq 和 .groupBy 似乎是合乎逻辑的步骤......它可能只有 100MB 和一百万左右的记录,所以这很好用......但如果有更聪明的方式来从头到尾,我愿意接受批评也是。

错误

如果我分解所有这些步骤并在每个相关步骤中声明类型...错误会更改为此...

所以这就是我难过的地方。我认为使 T 协变解决了这个问题...... T 是 Record 的声明子类型,但也许它没有将 Seq[T] 识别为 <: Seq[Record]?

但是进行此更改会在顶部产生错误...

回到这个...

我什至走在正确的轨道上吗?

0 投票
2 回答
58 浏览

scala - 有界变体泛型变为 Any?

我正在修补一些泛型、懒惰和隐式,并碰上了我很确定只与我的泛型类型的边界有关的墙(但我可能错了......)我试图构建一个 Stream-Like事物:

它实际上似乎工作得很好,除了一件事,(至少就我的测试而言,所以我可能会遗漏其他问题)。一件事是我在 cons 和 #:: 行为中使用的界限,每个 MyStream 都会退化为 MyStream[Any]。

但是,如果我使用天真的泛型:

类型保持稳定,但我不能使用 cons / #:: 将任何内容附加到 MyStream.empty,因为那是 MyStream[Nothing],在使用这些操作时我的类型也不能有任何其他变化(显然而是打破了这件事)。

我认为我在相当密切地关注 Martin Odersky 在 List 中的方差背景下给出的示例,这里唯一的关键区别似乎是我的 cons / #:: 操作的“静态”性质(我相信这是必不可少,因为我认为我不能拥有“懒惰的这个”(从概念上讲,至少对我来说这似乎是不可能的!

我错过了什么?

0 投票
2 回答
1001 浏览

scala - 在 Scala 中组合类型边界

假设我有一个功能,例如:

我想知道是否有一种方法可以将这两者组合成一个类型W,以便我可以拥有:

用例是:

我可能有两种不同的 foo 实现,其中一种具有简单的W1类型绑定,而另一种是T<:W1 <:W2我想要更复杂的一种来定义 aW3以便我可以拥有:

同样,我希望能够使用类型类来完成这些。所以如果我有:

我希望有

这个用例与前面的案例基本相同。

这可能吗?

0 投票
1 回答
118 浏览

scala - 在scala中扩展特征时如何创建新的特定类型的类

我有一个特征,其中(除其他外)我想要一个方法来创建类的新实例,然后还有其他方法使用该类的实例。

我的代码的一个非常精简的版本是:

我想在这里展示的是 next 将返回该类的一个新实例(实际上带有一些新的构造函数参数)并且 get 方法将在内部使用 next (以及其他逻辑)

上面的问题是编译器说“B类必须实现抽象成员get(end:A):A”,这是合理的。

我尝试使用类型边界来解决它:

但现在错误是“B 类型的表达式不符合预期的 TX 类型”new B()和“A 类型的表达式不符合预期的 TX 类型”end.prev

我不明白为什么这是一个问题,因为接下来要返回一个 B,它是 A 的子类型,这就是 TX。

有没有办法实现我希望在这里做的事情?


一点上下文,以防以上所有内容看起来都太抽象了。我正在实现一个循环双向链表,因为我找不到类似的东西。特征包括:

我的课看起来像:

所以toStream映射到get我的缩减示例中。