當一個錫蘭模塊導入「java.base」「8」時,它看不到原始的java.lang類,但它得到了別的東西。Java的包裝類和錫蘭基本類型之間的映射
因此,當我想要從java字符串解析爲java整數時,我必須將java字符串轉換爲錫蘭字符串,然後將其解析爲java整數。
module.ceylon:
native("jvm")
module mod "1.0.0" {
import java.base "8";
}
run.ceylon:
import java.lang{
JI = Integer,
JS = String,
}
// strange:
// java String constructor expects ceylon strings
// in pseudo dotted ceylon : java.lang.String(ceylon.language.String s)
JS t = JS("fdsf" of String);
// very strange:
// javas base library expects ceylon base types:
// java.lang.Integer.valueOf(ceylon.language.String s)
JI ji = JI.valueOf(t.string);
// Where t is a java String.
// strange like an elephant:
// JI.valueOf(t.string) returns a java type.
// for some purposes it's ok,
// but where can I buy the complete documentation ???
我援引Ceylon:Interoperation/Gotcha again!:
有Java的包裝類像java.lang.Integer中之間沒有映射或java.lang.Boolean和Ceylon基本類型 ,因此必須通過調用(例如intValue()或booleanValue())顯式地執行這些轉換,或者通過明確地 實例化包裝類,就像在Java原始類型和其包裝類之間轉換時所做的那樣。「
因此,儘管它很複雜,但仍然有效。但是當我想要 在不涉及String的java類型之間進行直接轉換時,我該怎麼辦?
這會導致一個問題,因爲在錫蘭沒有簡單的t.string類比,沒有「t.int」或「t.float」。
所以,java和錫蘭之間有一個轉換。但價格很高:java類型之間的直接轉換(轉換或解析)會丟失。
所以請展示如何實現Java類型(原始和包裝)之間的直接轉換。我不是在討論包含在ceylon.interop.java中的數組和其他東西。
這是不容易找到在java.lang API周圍,因爲類型映射規則incompletly應用:
JI ji = JI.valueOf(t.string);
,一方面「的valueOf」預計一錫蘭輸入,但在另一方面,它返回一個java值。 爲什麼不與原始java.lang中的相同,即僅在java類型之間進行轉換?有直覺規則嗎?
請給出一個完整的原始java.lang和java.lang之間差異的文檔,從錫蘭可以看到嗎?
我怎樣才能從錫蘭看到java.base的完整文檔(當不在eclipse中工作時),從反射生成一個...?
...我怎麼能解析VOM Java字符串到Java int的? – Michael
...及其可能很重要,以澄清「映射」的含義。看起來很奇怪的是,Eclipse中的工具提示顯示了來自java.lang和錫蘭類型的簽名。人們會期待原始的,然後自動投射。我認爲最好是告訴別人沒有強制轉換 - 相反,java.base適用於錫蘭環境,而不需要類型轉換。 – Michael
@ user3464741或者'JInteger.parseInt(jstring.string)'或者使用Ceylon的'parseInteger()'函數並且將結果斷言爲'Integer'。 –