2016-08-01 33 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'。 –

相关问题