具有抽象类型成员的具体类

Tho*_*ung 6 types scala

鉴于以下特点和阶级.为什么编译?这真的可以用于什么吗?

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.

Rex*_*err 2

如果对我来说无用的话,它看起来也无害。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 类型,所以我们再次变得无用。

除非我错过了什么。