创建对象后是否可以获取类型字段的类型?

Joh*_*ood 0 types scala

创建对象后是否可以获取类型字段的类型?

我想做这样的事情:

scala> class A { type T = String }
defined class A

scala> val a = new A
a: A = A@591171

scala> a.T   
<console>:13: error: value T is not a member of A
           a.T
             ^
Run Code Online (Sandbox Code Playgroud)

最后

Tra*_*own 5

你想对这个类型做什么?您可以使用类的类型(没有实例)以各种方式使用类型投影:

scala> class A { type T = String }
defined class A

scala> val x: A#T = "test"
x: java.lang.String = test

scala> def f(b: A#T) = b
f: (a: java.lang.String)java.lang.String
Run Code Online (Sandbox Code Playgroud)

或者,如果启用-Ydependent-method-types,则可以从实例中获取类型成员:

scala> val a = new A
a: A = A@6a3de2df

scala> val x: a.T = "test"
x: a.T = test

scala> def f(b: a.T) = b
f: (b: a.T)a.T
Run Code Online (Sandbox Code Playgroud)

在2.10之前的Scala的反射API并没有真正以任何干净的方式对类型进行建模,所以如果你想在某种意义上"获得类型",那么你可能运气不好.