问题标签 [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.
scala - Scala中番石榴的MinMaxPriorityQueue中的类型参数Bounds [T <:Comparable [_]]
尝试创建一个MinMaxPriorityQueue
使用番石榴的库我遇到以下问题:
这有效:
但这不是:
据我在搜索[1]时发现,这可能是因为 Java 将 scalaDouble
视为double
Java 中的 a,而不支持Comparable
. 所以我试过这个:
这可行,但是当我尝试添加另一个元素时:
它失败:
这似乎与[1]中提到的问题有关。
我也试过写一个Type View:
这给出了同样的错误。
有没有解决方法来解决这个问题?
scala - Scala 泛型类型边界 - 指向实际类型
我正在使用 scala 泛型和类型边界来了解其可能的用例。我对一个场景感到困惑。
假设我有一个特质 Combinable
我想为 Vector[A] 实现一个隐式定义:
到目前为止一切都很好,如果我将 Vector 替换为 B 类型上限,问题就开始了GenTraversable
:
我只是希望此方法以 B 类型返回,但self ++ other
失败并出现以下编译错误:
GenTraversable[A] 类型的表达式不符合预期的 B 类型
scala - 如果 bound 是抽象类型成员,则具有上限的更高种类的类型构造函数不起作用
我想定义一个由上限R
和更高种类的类型构造函数参数化的特征,该构造函数F[_]
只接受R
. 我希望这个 trait 实现一个apply
可以将任何F[A]
转换为 的多态Unit
,前提是A <: R
.
这段代码工作得很好:
(见下文关于命名的备注)
R
现在,如果我通过将其声明为某个模块的类型成员来抽象它,并Fnctr[A <: R]
在该模块中定义,如下所示:
一切都中断了,我收到两条我不知道如何解释的错误消息:
我希望编译器能够识别出这三个内部ModuleImpl
都是相同的类型。CoCone[Domain, Fnctr]
Domain = AbstractDomain = R
我在这里遗漏了一些明显的东西,还是scalac
2.12.4 的限制?如果这是一个限制,有人曾经在任何地方报告过吗?
编辑发现类似的东西:问题#10186。是“一样的”吗?不一样”?如果它是一个错误,我应该将它作为另一个测试用例提出吗?如果有人可以确认这不完全是我的错,和/或它确实与相关问题密切相关,那将是问题的可接受解决方案。
Edit2:正如@Evgeny 指出的那样,它不能完全是问题10186,因为它在不同的编译器阶段(refchecks
而不是typer
)失败。
关于名称的备注:我在CoCone
这里将特征称为特征,类似于通常定义~>
的可以被视为自然转换的定义。在某种程度上,CoCone[Dom, Fctr]
类似于Fctr ~> Const_Unit
,但域F
仅限于 的子类型Dom
。实际上,它是可以通过网络发送某些子类CoCone[R, F]
的形状的东西,但这并不重要,所以我已经抽象了名称。这东西是一个比较普通的数学结构,没什么做作的,如果能编译出来就好了。F
R
scala - 如何理解 Scala 的 Option 中超类型和方差的使用?
具体来说,看getOrElse
.
ScalaOption
被定义为协变的,A
如下所示:
of 的定义getOrElse
似乎暗示A
必须返回一个超类型,这对我来说不一定很有意义。但实际上,它看起来像任何事情:子类型或超类型。
考虑到限制,这怎么可能?具体来说,我不明白optB.getOrElse(new C)
在给定约束的情况下如何允许getOrElse
(它应该返回 Option 类型参数的超类型)。
scala - 上限类型限制允许子类型但不允许父类型
是否有可能有一个泛型方法,其类型绑定相当于“这个特征的每个可能的具体子类,但不是特征本身?”
例如,假设我有以下继承层次结构:
我想定义一个def eatFruit[T <: ???](fruit: Seq[T])
允许T
类型为Apple
, Orange
,Watermelon
等但不是类型的方法Fruit
。类型绑定[T <: Fruit]
显然不能完成这项工作。
最初的动力是我们有一个FruitRepository
类允许批量/批量插入不同的水果。批处理是在类外部完成的,因此目前它有很多方法saveApples(apples: Seq[Apple])
,如saveOranges(oranges: Seq[Orange])
、 等,其中包含许多涉及创建批处理更新语句的重复逻辑。我想以更通用的方式管理它,但任何方法saveFruit(fruit: Seq[Fruit])
都允许例如包含苹果和橙子的列表,存储库无法处理。
...我还要承认,我现在通常对这种类型绑定是否可能感到好奇,即使我们最终以不同的方式解决了存储库问题。
rust - 为什么需要 AddAssign 作为超特征的特征也需要调整大小?
我有一个特质,要实现这个特质,我想要求实现者实现AddAssign
;但是,这样做会导致我的特征似乎需要Sized
:
Bar
编译得很好;Foo
, 然而:
如果我添加+ Sized
到特征边界,一切都很好,但是……为什么我需要这样做?为什么AddAssign
不需要这个?
scala - scala反射类型边界
我正在尝试使用 Scala 反射 api 从案例类构建一整套路径。传递给构造函数的参数之一具有作为类型上限的特征(特征的所有实例都是案例类)。在运行时,我只能将这个参数作为特征的实例而不是作为底层案例类来访问。这是一个例子:
在这种情况下,我希望 getPaths 返回:[“id”、“upper.value”、“upper.other”]。我已经设法通过从 upper 获取 isStable 符号来破解它以返回 ["id", "upper.value"] 但这不是很好,因为:a)我缺少字段 b)这个解决方案不会泛化(如果嵌套的上部包含嵌套对象本身,我认为它不会应付)。
问题似乎是 Scala 反射 API 将鞋面视为鞋面,即使它是 Bounded[UpperBoundImpl] 的 typeTag。有谁知道我如何让反射 api 将上限视为其运行时/更具体的类型而不是其上限类型?
java - 使用 & 的奇怪的 Java 强制转换语法
(实际上,这个问题与 lambdas 没有直接关系,而是与使用边界的强制转换有关,所以标记为重复的问题并没有提供这个问题的答案。你可以在这里找到我的问题的答案:我应该如何为 Java强制转换具有多个边界的泛型?)
就在最近,我参加了一个 SW 工艺会议。在一个讨论的示例中,我遇到了这种类型的转换,它似乎是自 Java 8 以来有效的 Java。
我的问题:谁能告诉我这背后的成语以及它究竟能为我们做什么?该示例的演示者无法解释它,我也没有找到任何提及(我什至不知道它的名称)。
除了 Oleksandr's 之外,我还必须在这里提供另一个答案,因为这个问题已经被标记为重复,因此被锁定。
与此同时,我能够构建一个(人为的)用例,只是为了让这个想法更清楚。
假设我们有泛型方法foo()
,它的唯一参数是泛型的,并且类型参数有两个上限(反对Comparable
和Serializable
):
进一步假设,我们有一个类AClass
,它实现Comparable
和Serializable
进一步假设人为的部分,我们有一个AClass
object instance
,它被分配给 type 的变量Object
:
如果在代码的另一个地方,我们想要传递instance
给foo()
,并且我们不知道instance
( 是AClass
) 的动态类型,我们可以使用特殊的强制转换语法来放置一个“隐形眼镜”instance
以使调用工作:
实际上,特长不在于转换语法,而在于如何指定类型。这个类型规范声明了一个所谓的交集类型。
scala - 构建器中的 Scala 类型边界
我想我把我的问题缩小到以下几点:
编译器似乎对其中的大部分内容都很满意,除了构建器部分。这里它给出了这个错误:
我希望SpecificThing
作为 type 的子类型Thing
和SpecificThingSource
type ThingSource[SpecificThing]
,没有歧义的余地。我错过了什么?甚至可以以这种方式使用构建器吗?还是有更好的方法来实现我想要的?
scala - Scala 泛型多类型变体
我用 Scala 类型做了一些实验
并试图做这样的事情:
试图运行这个:
我如何在不添加特征的情况下正确地做到这一点?
不是这样的。还有其他一些方法吗?