问题标签 [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 回答
174 浏览

java - java中多个类的泛型类型

如何实现将一个类的泛型类型绑定到多个类?一个例子是 Number 和 Boolean 的子类。

0 投票
1 回答
448 浏览

scala - 为什么我收到“类型参数...不符合特征...”编译器错误?

我现在在 IntelliJ (14.1.5) 中遇到 Scala (2.11.7) 编译器错误已经好几个小时了。我在 Google 上搜索过,绞尽脑汁并尝试了很多变化,但似乎无法绕过它。

我已经获取了代码上下​​文并尽可能地将其剪裁得尽可能小(包括剪裁任何外部库依赖项)以捕获我一直用来尝试缩小问题范围的域。我以为我使用的是非常简单的惯用 Scala;案例对象,带有类型参数的特征等。

从最后一行开始的第四行abstract case class CoordinateRadian是产生这个 Scala 编译器错误的那个:

错误:(128, 129) 类型参数 [Test.this.CoordinateRadian.unitBase.type,Test.this.LongitudeRadian,Test.this.LatitudeRadian] 不符合特征坐标的类型参数边界 [U <: Test.this.Angle .UnitBase.Member,+O <: Test.this.Longitude[U],+A <: Test.this.Latitude[U]] 抽象案例类 CoordinateRadian private[CoordinateRadian] (longitude: LongitudeRadian, latitude: LatitudeRadian) extends Coordinate [CoordinateRadian.unitBase.type, LongitudeRadian, LatitudeRadian] {

这是编译器错误的代码:

您会注意到文件末尾的第五行是注释掉的行(与文件末尾的第四行非常相似)。如果取消注释最后一行的第五个,然后注释掉最后一行的第四个并编译代码(IntelliJ 中的“Build All”),将发出两个错误:

错误:(125, 67) 在 trait Coordinate of type => Test.this.Longitude[Test.this.CoordinateRadian.unitBase.type] 中覆盖方法经度;值经度具有不兼容的类型抽象案例类 CoordinateRadian private[CoordinateRadian] (longitude: LongitudeRadian, latitude: LatitudeRadian) extends Coordinate[CoordinateRadian.unitBase.type, Longitude[CoordinateRadian.unitBase.type], Latitude[CoordinateRadian.unitBase.type]] {

错误:(125, 95) 在 trait Coordinate of type => Test.this.Latitude[Test.this.CoordinateRadian.unitBase.type] 中覆盖方法纬度;值 latitude 具有不兼容的类型 abstract case class CoordinateRadian private[CoordinateRadian] (longitude: LongitudeRadian, latitude: LatitudeRadian) extends Coordinate[CoordinateRadian.unitBase.type, Longitude[CoordinateRadian.unitBase.type], Latitude[CoordinateRadian.unitBase.type]] {

我可能只是在这方面工作了太久,现在眼睛有黄疸。我在一个多小时内没有想到任何新的方法来解决这个问题。所以,任何关于我做错了什么的指导都将不胜感激。

0 投票
1 回答
278 浏览

scala - Scala泛型:为什么具有相同上限的两种类型不兼容?

我对 Scala 泛型中边界的工作方式感到困惑。考虑以下:

这给了我一个错误:

在我幼稚的理解中,两者都是ReturnTypeB的子类型,MessageBody因此必须兼容。那么为什么它们不兼容,我应该如何编写代码以使它们兼容?


编辑:下面的代码工作得很好,如果我在任何地方混合MessageKeyMessageBody实例之间的关系,我会得到一个很好的编译时错误。

编辑:显然,没有办法编译检查这个:handler.messageHandler(Key3)这将导致在MatchError运行时。

0 投票
4 回答
831 浏览

java - Java 类型擦除和多重边界

我知道在 Java 泛型中,当使用具有多个边界的类型参数时,编译器会将类型信息擦除到“最左边的边界”(即列表中的第一个类/枚举或接口)。那么为什么下面的代码编译没有问题呢?

类型参数 T 不应该被视为 Object 吗?(因此不允许我调用 close() 或 append())??

0 投票
1 回答
128 浏览

scala - 为什么类型参数绑定的方法>:允许子类型?

考虑以下 Scala 中堆栈的简单实现:

现在假设我们要向push. Stack天真的尝试

失败是因为Ain(x: A)是一个逆变位置。在Scala by Example第 58 页中,作者建议

这里绑定的类型是指给定一个特定类型的栈,我们可以将相同或更通用类型的对象压入该栈,结果是更通用类型的栈。

例如,

我认为这种选择的重点在于它真正保持了 的协方差Stack:如果一段代码期望 aStack[Fruit]将任何水果(香蕉或苹果)推到其上,那么它仍然可以将这些水果推到 a 上Stack[Apple]

令人惊讶的是,我们还可以推送子类型:

为什么允许这样做?类型绑定不是>:意味着只允许超类型吗?

0 投票
2 回答
751 浏览

scala - Scala 抽象类型成员 - 继承和类型界限

今天我在 Scala 中遇到了一些奇怪的情况,当时我试图改进抽象类型成员的类型边界。

我有两个特征定义类型成员的边界并将它们组合在一个具体的类中。这很好用,但是当与特征组合匹配/转换时,只有两个 TypeBounds 之一是“活动的”,我很难理解为什么......

我试图准备一个例子:

现在,如果我将这两个特征结合在一个具体的类中

我可以按预期通过 get 访问我的会员

但是如果我转换为(左与右)或模式匹配,我将无法再访问该成员。根据顺序,我可以从左或右获得类型边界,但不是两者的组合。

我知道 Left with Right 与 Right with Left 不同,但在这两种情况下,两种类型的界限都包括在内,那么为什么我只能让一个工作呢?

谁能解释为什么会这样?

0 投票
2 回答
2036 浏览

java - 类型参数边界 - 未经检查的覆盖:返回类型需要未经检查的转换

如何摆脱Unchecked overriding: return type requires unchecked conversion. Found 'org.example.AAndB<java.lang.integer>', required 'T'.以下代码中的警告。

我尝试设计一个接口 ( Interface),使其不会显式声明方法的返回类型get()( AAndB<Integer>),而是枚举结果必须实现的接口 ( <T extends B<Integer> & A> T)。

0 投票
1 回答
443 浏览

oop - 多态父派生类型

我正在尝试设置一个父类型geom具有可分配字段的 Fortran OOP 代码shape。该字段分配有扩展类型之一,其扩展类型为geomacircle或 arectangle类型。在另一个模块中,我有一个body类型,其中包含一个geom字段。

所以基本上我想要一个geom可以实际访问不同类型的类型(然后将根据类型访问不同的字段)和一个body用几何初始化的类型。

找到下面的代码。这是几何的模块:

这是身体的模块:

这就是我从主文件初始化它们的方式:

但是,使用 gfortran 4.8.4 编译时出现此错误。

0 投票
2 回答
233 浏览

scala - 如何匹配没有特定类型类实例的类型?

我想为那些没有特定类型类实例的类型定义一些行为:

我们可以处理类型类中的差异,但是我需要创建额外的实例来支持一些通用行为。

有没有办法否定类型绑定?一种通过!:编译来制作函数的方法?

(我想在香草Scala中做到这一点,没有scalaz,无形等)

0 投票
0 回答
49 浏览

scala - 什么特定的用例应该使用 =:= 运算符而不是上下文绑定,为什么?

在下面的代码中(在另一个答案中提到,但引出了一个单独的问题),一个所谓的证据参数用于向编译器指示 A 参数是通过上下文绑定的字符串类型。

但是,为什么不简单地定义没有类型参数的类呢? 我的意思是,如果您参数化正在使用的类型,那么您需要一个泛型类;否则,为什么不直接省略类型参数,如下所示?

上下文绑定带来优势的例子是什么?