当一个锡兰模块导入“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'。 –