2015-10-16 90 views
1

我使用类型投影。你可以在下面的例子中找到一个类型别名。如何在Scala中创建投影类型的实例?

object Example extends App { 
    type AliasForY = X#Y 

    class X { 
    class Y { 
     def fun = 100500 
    } 
    } 

    def f(y: AliasForY) = y.fun 

    println { 
    f(new AliasForY()) 
    } 

} 

我想通过别名实例化我的内部类,但我得到一个错误Example.X is not a legal prefix for a constructor

我该如何解决?

回答

4

内部类不能在其包含的类之外实例化。如果要在X之外创建Y的新实例,则需要为object

+0

所以,我不能这样做,通过'AliasForY',对不对? – Finkelson

+0

这是正确的,除非您将“Y”放入伴随对象中。 – jkinkead

1

要创建一个内部类的实例,您应该有一个包含它的类的实例。所以这将工作:

val x = new X 
f(new x.Y()) 
+0

是的,我知道如何在内部类上创建实例。我不知道的是,为什么我们需要Scala中的投影类型,如果我们不能在该别名类型上创建一个实例,就像这种“输入AliasForY = X#Y'”。 – Finkelson

+0

@Finkelson - X#Y表示它是某个X的Y.你仍然需要X,即使你不关心它是哪一个。 –

+0

@Finkelson有很多类型你不能只创建一个实例:特征,抽象类型,结构类型等。这里没有什么特别的投影类型。 –

相关问题