作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
无法弄清楚为什么这是错误的或如何解决它。这是重现问题的“蒸馏”代码。请帮忙,但我不喜欢任何“为什么”问题 - 有非常真实和有效的答案,但它们是专有且不可更改的,因此与解决方案无关。
object Sandbox {
// --- Following are really Java interfaces/classes ---
trait R[X <: U[X,Y], Y <: E[X,Y]];
class U[X <: U[X,Y], Y <: E[X,Y]] extends R[X,Y];
class E[X <: U[X,Y], Y <: E[X,Y]] extends R[X,Y];
trait R2 extends R[U2,E2];
class U2 extends U[U2,E2] with R2;
class E2 extends E[U2,E2] with R2;
// --- End Java interfaces/classes ---
def trouble[X <: U[X,Y], Y <: E[X,Y], Z <: R[X,Y]](r: Z) {}
def main(args: Array[String]) {
trouble(new U()); // Fine
trouble(new E()); // Fine
trouble(new U2()); // Not fine, reports:
/*
* inferred type arguments [Nothing,Nothing,Sandbox.U2]
* do not conform to method trouble's type parameter bounds
* [X <: Sandbox.U[X,Y],Y <: Sandbox.E[X,Y],Z <: Sandbox.R[X,Y]]
*/
trouble(new E2()); // Not fine, reports:
/*
* inferred type arguments [Nothing,Nothing,Sandbox.E2]
* do not conform to method trouble's type parameter bounds
* [X <: Sandbox.U[X,Y],Y <: Sandbox.E[X,Y],Z <: Sandbox.R[X,Y]]
*/
trouble[U2,E2,R2](new U2()); // Fine
trouble[U2,E2,R2](new E2()); // Fine
}
}
编译器似乎无法仅根据指定的单个参数来推断“麻烦”方法的 X、Y 和 Z 类型参数。我明白了 - 当我指定类型时,它是可以的,但它很麻烦。有没有办法以某种方式插入/帮助编译器,从而不再成为问题?
也许我对 Scala 的类型推断系统过于自信,但所有信息都可用。
提前致谢!
最佳答案
您对 Scala 的类型系统推断过于自信。您尝试使用这些更复杂(尤其是递归的)类型定义的次数越多,您就越会发现这一点。我不知道我是否可以提供“为什么它不能解决这个问题”,但我可以提供一些有用的东西:
不要在类型上参数化 R,而是使它们成为必须在子类型中声明的抽象成员:
trait R {
type X <: U[X,Y]
type Y <: E[X,Y]
}
class U[X0 <: U[X0,Y0],Y0 <: E[X0,Y0]] extends R {
type X = X0
type Y = Y0
}
class E[X0 <: U[X0,Y0], Y0 <: E[X0,Y0]] extends R {
type X = X0
type Y = Y0
}
trait R2 extends R;
class U2 extends U[U2,E2] with R2
class E2 extends E[U2,E2] with R2
def trouble[X <: U[X,Y], Y <: E[X,Y], Z <: R](r: Z) {}
然后我相信你会发现你的 main 方法编译没有改变。
顺便说一句,代码中的每个分号都可以在不改变含义的情况下删除。
关于带有泛型参数的 Scala 方法调用似乎不是多态的——出了什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13757294/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!