2017-04-17 79 views
0

隨着調用與Java(或階)類型參數

shared T f<T>(T t){ 
    return t; 
} 

一個錫蘭頂級功能我預計像

mod.f_.f[Integer](1) 

Scala中,其中[Integer]是類型參數的工作。但它不接受類型參數。

又爲何斯卡拉看到一個getter,而不是一個功能

shared Integer(Integer) fi = f<Integer>; 

我預計 整數(整數) 到足以告訴編譯器揭露一個函數階。

回答

-1

錫蘭實際上應該滿足類型安全的要求,以安全的方式處理空值。但它不在運行時。

所以,有一個很簡單的問題的答案:

scala> mod.f_.f(null,3). 

那真的很有趣。

當然,也有更多的方式來獲得樂趣:

scala> implicit def f(x:Any):com.redhat.ceylon.compiler.java.runtime.model.TypeDescriptor = com.redhat.ceylon.compiler.java.runtime.model.TypeDescriptor.klass(x.getClass) 

scala> mod.f_.f(List(),3) 
scala> mod.f_.f(List,3) 
scala> mod.f_.f(Float,3) 
... 
+1

您如何期待錫蘭以更安全的方式處理此處的空? 錫蘭的類型系統適用於編譯時,而不是在運行時從Ceylon外部訪問Ceylon函數。 –

+0

您如何期望用戶以安全的方式處理null?例如。編程! – Michael

8

我不知道斯卡拉,所以我只能幫了與Java的一部分,但這裏是你如何從Java調用該函數:

f_.f(Integer.$TypeDescriptor$, Integer.instance(1)) 

或:

f_.<Integer>f(Integer.$TypeDescriptor$, Integer.instance(1)) 

錫蘭功能被泛化的泛型,所以類型參數變成常規參數,並且你必須提供類型參數的類型描述符對象。錫蘭類和接口有一個靜態的$TypeDescriptor$成員,你可以使用它;我不知道其他東西(Java類,聯合類型和交集類型......)如何在我的頭腦中工作,但是您可以在Ceylon中編寫等效的調用,並通過編譯--verbose=code來查看生成的Java代碼。

這裏是一個完整的,工作與你的f功能和G調用它的Java類例如:gist

+3

@邁克爾您可以用'TypeDescriptor.klass(Whatever.class)'得到'TypeDescriptor'爲Java或斯卡拉類'不管'。 –