鉴于以下特点和阶级.为什么编译?这真的可以用于什么吗?
trait Container {
type A
}
trait AnotherContainer[B]{
def x(b : B) : B
}
trait Mixed extends Container with AnotherContainer[Container#A]
class Impl extends Mixed{
def x(a : Container#A) = a
}
new Impl().x _
scala> new Impl().x _
res0: (Container#A) => Container#A = <function>
Run Code Online (Sandbox Code Playgroud)
更新:
class Baz { type T; }
Run Code Online (Sandbox Code Playgroud)
实际上是一个功能,但我找不到它的动机:#1753.
如果对我来说无用的话,它看起来也无害。x 想要的类型不存在,因此无法将其传递给该方法。我想,无害的无用是否应该是一个编译时错误是一个品味问题。
如果你看看 x 实际上做了什么,它会这样反编译:
public java.lang.Object x(java.lang.Object);
Code:
0: aload_1
1: areturn
Run Code Online (Sandbox Code Playgroud)
这正是 Identity 方法应该做的事情(无论类型如何加载参数,然后返回它)。您可以用更少的代码编写等效的代码:
trait AbstractType { type T }
class Useless extends AbstractType { def identity(t: AbstractType#T) = t }
Run Code Online (Sandbox Code Playgroud)
除了没有任何东西具有 AbstractType#T 类型,所以我们再次变得无用。
除非我错过了什么。