Java的包装类和Ceylon基本类型之间的映射

时间:2016-08-01 06:57:35

标签: java ceylon

当一个锡兰模块导入“java.base”“8”时,它没有看到原始的java.lang类,但它得到了别的东西。

因此,当我想要从java字符串解析为java整数时,我必须将java字符串转换为ceylon字符串,然后将其解析为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基元类型和它的包装类之间进行转换时在Java中那样。“

所以,虽然复杂但它仍然有效。但是当我想要的时候我能做什么 不涉及String的java类型之间的直接转换。

这会引起一个问题,因为在锡兰中没有简单的类似于t.string的方法,例如没有“t.int”或“t.float”。

因此,java和锡兰之间存在转换。但价格很高:java类型之间的直接转换(强制转换或解析)将丢失。

所以请说明如何在java类型(原始和包装)之间实现直接转换。我不是在讨论ceylon.interop.java中包含的数组和其他内容。

在java.lang api中找到它并不容易,因为类型映射规则不完整地应用:

  JI ji = JI.valueOf(t.string);

一方面,“valueOf”需要锡兰输入,但另一方面它返回一个java值。 为什么不与原始的java.lang相同,即只在java类型之间进行转换?是否有直观的规则?

您能否提供一份完整的文档,说明从锡兰看到的原始java.lang和java.lang之间的差异?

如何从锡兰(当不在eclipse中工作时)获得java.base的完整文档,从反射中生成一个...?

1 个答案:

答案 0 :(得分: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()

  

类型映射规则不完整地应用:

他们不是。规则是:j.l.String并且基本类型(intdouble等)被映射到它们的Ceylon等价物。所有其他类型 - 包括,如

中所述
  

Java的包装类如java.lang.Integer或java.lang.Boolean和Ceylon基本类型之间没有映射,

包装类 - 未映射。

(编辑:在关于ceylon.language::Integer的问题中编辑的OP ...这不是Java类型,也不是包装类型。它正是它的本质。)

因此,Java签名java.lang.Integer valueOf(java.lang.String)将映射到Ceylon签名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/

  

如何从锡兰(当不在eclipse中工作时)获得java.base的完整文档,从反射中生成一个...?

我认为这不可行,但它可能会有用......