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

scala - Scala中番石榴的MinMaxPriorityQueue中的类型参数Bounds [T <:Comparable [_]]

尝试创建一个MinMaxPriorityQueue使用番石榴的库我遇到以下问题:

这有效:

但这不是:

据我在搜索[1]时发现,这可能是因为 Java 将 scalaDouble视为doubleJava 中的 a,而不支持Comparable. 所以我试过这个:

这可行,但是当我尝试添加另一个元素时:

它失败:

这似乎与[1]中提到的问题有关。

我也试过写一个Type View

这给出了同样的错误。

有没有解决方法来解决这个问题?

0 投票
2 回答
102 浏览

scala - Scala 泛型类型边界 - 指向实际类型

我正在使用 scala 泛型和类型边界来了解其可能的用例。我对一个场景感到困惑。

假设我有一个特质 Combinable

我想为 Vector[A] 实现一个隐式定义:

到目前为止一切都很好,如果我将 Vector 替换为 B 类型上限,问题就开始了GenTraversable

我只是希望此方法以 B 类型返回,但self ++ other失败并出现以下编译错误:

GenTraversable[A] 类型的表达式不符合预期的 B 类型

0 投票
1 回答
397 浏览

scala - 如果 bound 是抽象类型成员,则具有上限的更高种类的类型构造函数不起作用

我想定义一个由上限R和更高种类的类型构造函数参数化的特征,该构造函数F[_]只接受R. 我希望这个 trait 实现一个apply可以将任何F[A]转换为​​ 的多态Unit,前提是A <: R.

这段代码工作得很好:

(见下文关于命名的备注)

R现在,如果我通过将其声明为某个模块的类型成员来抽象它,并Fnctr[A <: R]在该模块中定义,如下所示:

一切都中断了,我收到两条我不知道如何解释的错误消息:

我希望编译器能够识别出这三个内部ModuleImpl都是相同的类型。CoCone[Domain, Fnctr]Domain = AbstractDomain = R

我在这里遗漏了一些明显的东西,还是scalac2.12.4 的限制?如果这是一个限制,有人曾经在任何地方报告过吗?

编辑发现类似的东西:问题#10186。是“一样的”吗?不一样”?如果它是一个错误,我应该将它作为另一个测试用例提出吗?如果有人可以确认这不完全是我的错,和/或它确实与相关问题密切相关,那将是问题的可接受解决方案。

Edit2:正如@Evgeny 指出的那样,它不能完全是问题10186,因为它在不同的编译器阶段(refchecks而不是typer)失败。


关于名称的备注:我在CoCone这里将特征称为特征,类似于通常定义~>的可以被视为自然转换的定义。在某种程度上,CoCone[Dom, Fctr]类似于Fctr ~> Const_Unit,但域F仅限于 的子类型Dom。实际上,它是可以通过网络发送某些子类CoCone[R, F]的形状的东西,但这并不重要,所以我已经抽象了名称。这东西是一个比较普通的数学结构,没什么做作的,如果能编译出来就好了。FR

0 投票
1 回答
202 浏览

scala - 如何理解 Scala 的 Option 中超类型和方差的使用?

具体来说,看getOrElse.

ScalaOption被定义为协变的,A如下所示:

of 的定义getOrElse似乎暗示A必须返回一个超类型,这对我来说不一定很有意义。但实际上,它看起来像任何事情:子类型或超类型。

考虑到限制,这怎么可能?具体来说,我不明白optB.getOrElse(new C)在给定约束的情况下如何允许getOrElse(它应该返回 Option 类型参数的超类型)。

0 投票
1 回答
475 浏览

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])都允许例如包含苹果和橙子的列表,存储库无法处理。

...我还要承认,我现在通常对这种类型绑定是否可能感到好奇,即使我们最终以不同的方式解决了存储库问题。

0 投票
1 回答
366 浏览

rust - 为什么需要 AddAssign 作为超特征的特征也需要调整大小?

我有一个特质,要实现这个特质,我想要求实现者实现AddAssign;但是,这样做会导致我的特征似乎需要Sized

(操场)

Bar编译得很好;Foo, 然而:

如果我添加+ Sized到特征边界,一切都很好,但是……为什么需要这样做?为什么AddAssign不需要这个?

0 投票
0 回答
96 浏览

scala - scala反射类型边界

我正在尝试使用 Scala 反射 api 从案例类构建一整套路径。传递给构造函数的参数之一具有作为类型上限的特征(特征的所有实例都是案例类)。在运行时,我只能将这个参数作为特征的实例而不是作为底层案例类来访问。这是一个例子:

在这种情况下,我希望 getPaths 返回:[“id”、“upper.value”、“upper.other”]。我已经设法通过从 upper 获取 isStable 符号来破解它以返回 ["id", "upper.value"] 但这不是很好,因为:a)我缺少字段 b)这个解决方案不会泛化(如果嵌套的上部包含嵌套对象本身,我认为它不会应付)。

问题似乎是 Scala 反射 API 将鞋面视为鞋面,即使它是 Bounded[UpperBoundImpl] 的 typeTag。有谁知道我如何让反射 api 将上限视为其运行时/更具体的类型而不是其上限类型?

0 投票
1 回答
772 浏览

java - 使用 & 的奇怪的 Java 强制转换语法

(实际上,这个问题与 lambdas 没有直接关系,而是与使用边界的强制转换有关,所以标记为重复的问题并没有提供这个问题的答案。你可以在这里找到的问题的答案:我应该如何为 Java强制转换具有多个边界的泛型?

就在最近,我参加了一个 SW 工艺会议。在一个讨论的示例中,我遇到了这种类型的转换,它似乎是自 Java 8 以来有效的 Java。

我的问题:谁能告诉我这背后的成语以及它究竟能为我们做什么?该示例的演示者无法解释它,我也没有找到任何提及(我什至不知道它的名称)。

除了 Oleksandr's 之外,我还必须在这里提供另一个答案,因为这个问题已经被标记为重复,因此被锁定。

与此同时,我能够构建一个(人为的)用例,只是为了让这个想法更清楚。

假设我们有泛型方法foo(),它的唯一参数是泛型的,并且类型参数有两个上限(反对ComparableSerializable):

进一步假设,我们有一个类AClass,它实现ComparableSerializable

进一步假设人为的部分,我们有一个AClassobject instance,它被分配给 type 的变量Object

如果在代码的另一个地方,我们想要传递instancefoo(),并且我们不知道instance( 是AClass) 的动态类型,我们可以使用特殊的强制转换语法来放置一个“隐形眼镜”instance以使调用工作:

实际上,特长不在于转换语法,而在于如何指定类型。这个类型规范声明了一个所谓的交集类型

0 投票
1 回答
58 浏览

scala - 构建器中的 Scala 类型边界

我想我把我的问题缩小到以下几点:

编译器似乎对其中的大部分内容都很满意,除了构建器部分。这里它给出了这个错误:

我希望SpecificThing作为 type 的子类型ThingSpecificThingSourcetype ThingSource[SpecificThing],没有歧义的余地。我错过了什么?甚至可以以这种方式使用构建器吗?还是有更好的方法来实现我想要的?

0 投票
0 回答
30 浏览

scala - Scala 泛型多类型变体

我用 Scala 类型做了一些实验

并试图做这样的事情:

试图运行这个:

我如何在不添加特征的情况下正确地做到这一点?

不是这样的。还有其他一些方法吗?