2015-10-16 105 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有很多類型你不能只創建一個實例:特徵,抽象類型,結構類型等。這裏沒有什麼特別的投影類型。 –

相關問題