问题标签 [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.
generics - 如何在 TypeScript 中设置类型参数的下限?
在 TypeScript(我的版本:2.1.1)中,可以为类型参数设置一个上限,如下所示:
如何设置下限A
?以下代码不起作用:
会导致编译错误。
TypeScript 存储库的 GitHub 问题#13337中的人建议使用
Y
与下界X
。但这不包括我的情况,其中X
是实际类型而不是类型参数。
关于如何降低类型参数的任何想法?
syntax - 特征中的“where”子句有什么作用?
如果我有这个代码:
该where
子句实际上做了什么?
天真地,我在想where Self: Sized;
关于类型实现的一些规定Trait
,比如'如果你Trait
为类型实现A
你的类型A
必须调整大小,即它可以是i32
但不是[i32]
。
但是,这样的约束宁愿去trait Trait: Sized
(如果我错了,请纠正我)?
现在我注意到where Self: Sized;
实际上决定了我是否可以调用f
或g
从内部调用object_safety_dynamic
。
我的问题:
幕后发生了什么?
我实际上是在告诉编译器什么(用简单的英语)
where Self: Sized;
可以g()
工作,但f()
不是?特别是:由于无论如何都是参考,因此各种(大小或未调整的)类型
&self
之间存在什么编译差异。它不会总是归结为类似的东西,无论类型是否调整大小?f
g
_vtable_f_or_g(*self) -> i32
where
为什么我可以同时实现 Trait
u8
和[u8]
. 编译器实际上不应该阻止我实现f()
for[u8]
,而不是在调用站点抛出错误吗?
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>>
为什么会出现这个错误?
scala - 在 Scala 中编写具有 ClassTag 和 AnyRef 约束的通用函数
阿帕奇SparkContext
有一个方法:
我正在尝试编写一个分析数据的包装器(现在它只是尝试记录大小)并调用原始方法:
org.apache.spark.util.SizeEstimator
期望一个AnyRef
,所以我得到一个错误。我对 Scala 不是特别有经验,所以ClassTag
-s 对我来说有点黑魔法。
如何修复这段代码,以便sc.broadcast
(期望ClassTag
)和SizeEstimator.estimate
(期望AnyRef
)都满意?
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
无论文本的形状如何,是否有正确的方法添加文本?
scala - Scala 多态性 - 协变和类型绑定
使用 Scala ...我无法弄清楚如何以混合类型绑定和协变的方式使用多态性。
简而言之,我认为我需要类似这种类型签名的东西......但是如果你按照我的虚拟示例进行操作,你就会明白我为什么会来到这里......也许我错了。
但这种方法会产生......
这是一个虚拟示例,它演示了我正在尝试做的事情...我可以通过仅使用基本特征 Record 来回避这个问题...但我想让它与出于其他原因的多态性一起工作真正的代码。
设置
多态函数
注意 - 从 Iterator 到 Seq 这里看起来有问题......我正在从 src/main/resources 读取一个文件......它作为一个 Iterator 进来......我最终需要将它放入一个 Map 中,所以.toSeq 和 .groupBy 似乎是合乎逻辑的步骤......它可能只有 100MB 和一百万左右的记录,所以这很好用......但如果有更聪明的方式来从头到尾,我愿意接受批评也是。
错误
如果我分解所有这些步骤并在每个相关步骤中声明类型...错误会更改为此...
所以这就是我难过的地方。我认为使 T 协变解决了这个问题...... T 是 Record 的声明子类型,但也许它没有将 Seq[T] 识别为 <: Seq[Record]?
但是进行此更改会在顶部产生错误...
回到这个...
我什至走在正确的轨道上吗?
scala - 有界变体泛型变为 Any?
我正在修补一些泛型、懒惰和隐式,并碰上了我很确定只与我的泛型类型的边界有关的墙(但我可能错了......)我试图构建一个 Stream-Like事物:
它实际上似乎工作得很好,除了一件事,(至少就我的测试而言,所以我可能会遗漏其他问题)。一件事是我在 cons 和 #:: 行为中使用的界限,每个 MyStream 都会退化为 MyStream[Any]。
但是,如果我使用天真的泛型:
类型保持稳定,但我不能使用 cons / #:: 将任何内容附加到 MyStream.empty,因为那是 MyStream[Nothing],在使用这些操作时我的类型也不能有任何其他变化(显然而是打破了这件事)。
我认为我在相当密切地关注 Martin Odersky 在 List 中的方差背景下给出的示例,这里唯一的关键区别似乎是我的 cons / #:: 操作的“静态”性质(我相信这是必不可少,因为我认为我不能拥有“懒惰的这个”(从概念上讲,至少对我来说这似乎是不可能的!
我错过了什么?
scala - 在 Scala 中组合类型边界
假设我有一个功能,例如:
我想知道是否有一种方法可以将这两者组合成一个类型W
,以便我可以拥有:
用例是:
我可能有两种不同的 foo 实现,其中一种具有简单的W1
类型绑定,而另一种是T<:W1 <:W2
我想要更复杂的一种来定义 aW3
以便我可以拥有:
同样,我希望能够使用类型类来完成这些。所以如果我有:
我希望有
这个用例与前面的案例基本相同。
这可能吗?
scala - 在scala中扩展特征时如何创建新的特定类型的类
我有一个特征,其中(除其他外)我想要一个方法来创建类的新实例,然后还有其他方法使用该类的实例。
我的代码的一个非常精简的版本是:
我想在这里展示的是 next 将返回该类的一个新实例(实际上带有一些新的构造函数参数)并且 get 方法将在内部使用 next (以及其他逻辑)
上面的问题是编译器说“B类必须实现抽象成员get(end:A):A”,这是合理的。
我尝试使用类型边界来解决它:
但现在错误是“B 类型的表达式不符合预期的 TX 类型”new B()
和“A 类型的表达式不符合预期的 TX 类型”end.prev
我不明白为什么这是一个问题,因为接下来要返回一个 B,它是 A 的子类型,这就是 TX。
有没有办法实现我希望在这里做的事情?
一点上下文,以防以上所有内容看起来都太抽象了。我正在实现一个循环双向链表,因为我找不到类似的东西。特征包括:
我的课看起来像:
所以toStream
映射到get
我的缩减示例中。