2016-08-01 34 views
2

當一個錫蘭模塊導入「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中工作時),從反射生成一個...?

回答

3

我不知道如何回答你的問題,因爲你說的很多,這不是一個真正的問題,然後你也問了幾個問題。但在這裏:

所以請展示如何實現Java類型(原始和包裝)之間的直接轉換。我不是在討論包含在ceylon.interop.java中的數組和其他東西。

import ceylon.language { 
    CInteger=Integer 
} 
import java.lang { 
    JInteger=Integer 
} 

shared void run() { 
    CInteger ci1 = 1; 
    JInteger ji1 = JInteger(ci1); 
    JInteger ji2 = JInteger.valueOf(ci1); 
    CInteger ci2 = ji1.intValue(); 
} 

您可以使用Java包裝類的構造函數或靜態valueOf方法。要轉回,請使用intValue()

類型映射規則incompletly應用:

他們不是。規則是:j.l.String和原始類型(int,double等)被映射到它們的Ceylon等價物。所有其他類型 - 包括在

如前面提到有Java的包裝類像java.lang.Integer中或者java.lang.Boolean的和錫蘭基本類型之間的映射關係,

包裝類 - 未映射。

(編輯:。在一個問題編輯OP約ceylon.language::Integer ......這不是一個Java類型,也不是包裝類型這正是它是什麼)

因此,Java的簽名java.lang.Integer valueOf(java.lang.String)被映射到錫蘭簽名java.lang::Integer valueOf(ceylon.language::String),因爲java.lang.String被映射,並且java.lang.Integer不是。 Integer構造函數從java.lang.Integer Integer(int)映射到java.lang::Integer Integer(ceylon.language::Integer),因爲映射基本類型int,但包裝類java.lang.Integer不是。這正是文檔告訴你的。

請給出一個完整的原始java.lang和java.lang之間差異的文檔,從錫蘭看到的?

http://ceylon-lang.org/documentation/1.2/reference/interoperability/type-mapping/

我怎樣才能得到java.base的完整文檔從錫蘭看到(在不偏食工作),產生一個從反射......?

我不認爲這是可用的,但它很可能是有用的...

+0

...我怎麼能解析VOM Java字符串到Java int的? – Michael

+0

...及其可能很重要,以澄清「映射」的含義。看起來很奇怪的是,Eclipse中的工具提示顯示了來自java.lang和錫蘭類型的簽名。人們會期待原始的,然後自動投射。我認爲最好是告訴別人沒有強制轉換 - 相反,java.base適用於錫蘭環境,而不需要類型轉換。 – Michael

+1

@ user3464741或者'JInteger.parseInt(jstring.string)'或者使用Ceylon的'parseInteger()'函數並且將結果斷言爲'Integer'。 –

相關問題