Scala中的以下预期行为或错误?Scala参数化通用参数
CASE 1:
class X[T1, T2]
class XExt[T1, T2] extends X[T1, T2]
class Y[T[t1] <: X[t1, _]]
class YExt extends Y[XExt]
导致 错误:XExt需要两个类型参数,预期:一个
class YExt extends Y[XExt]
^
但下面运行确定:
class X[T1, T2]
class XExt[T1, T2] extends X[T1, T2]
class Y[T[t1, t2] <: X[t1, t2]]
class YExt extends Y[XExt]
最小化参数的数量可能会变得很简单ify代码类型参数:类型T [t1] <:X [t1,_]。
案例2:
class X[T1, T2]
class Y[T[t1, t2] <: X[t1, t2]]
class Z[T <: Y[_]]
结果 错误:_ $ 1采取任何类型参数,预计:二
class Z[T <: Y[_]]
^
但如何避免定义y参数,如果我不要求他们?像:
class X[T1, T2]
class Y[T <: X[_, _]]
class Z[T <: Y[_]]
案例3:
trait A[T]
trait B[T[t] <: A[t]]
trait AExt extends A[Int]
trait BExt extends B[AExt]
结果 错误:AEXT不带任何类型参数,预期:一个
trait BExt extends B[AExt]
^
但为什么编译请求,如果一个参数它已经提供?这似乎是一个矛盾。以及如何继承B?
在IntelliJ Scala插件和Eclipse Scala IDE中观察到该行为。所以它可能是Scala编译器的功能。
我不认为你可以,是'Y [_]'嵌套的更高层次的不同,需要提供的编译足够的证据表明你尊重该约束的约束:'类Z [ S [t1,t2] <:X [t1,t2],T <:Y [S]]'。 – 2014-09-20 07:12:18
@Ende Neu:是的,但是Y [T]的约束是相同的。 T仍然有相同的界限。如果我不要求,我不认为有任何理由指定T.请看CASE 3.我刚刚添加了它。 – 2014-09-21 05:47:16
不,'T'没有相同的界限,类中的'T'和第二种情况下的'T'是两个不同的'T',仅仅因为它们具有相同的字母并不意味着它们是相关的。 – 2014-09-21 06:48:05