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

标签 java ceylon

当 ceylon 模块导入“java.base”“8”时,它看不到原始的 java.lang 类,但它得到了其他东西。

因此,当我想要从 java 字符串解析为 java 整数时,我必须将 java 字符串转换为 ceylon 字符串,然后将其解析为 java 整数。

模块.ceylon:

native("jvm")
module mod "1.0.0" {
    import java.base "8";   
}

运行.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 基本类型及其包装类之间进行转换时所做的那样。”

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

这会导致一个问题,因为 ceylon 中没有与 t.string 的简单模拟,例如没有“t.int”或“t.float”。

所以,java和ceylon之间存在转换。但代价很高:失去了java类型之间的直接转换(强制转换或解析)。

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

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

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

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

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

如何获得从 ceylon 看到的 java.base 的完整文档(不在 Eclipse 中工作时),从反射生成一个文档...?

最佳答案

我不知道如何回答你的问题,因为你说了很多并不是真正的问题,然后你又问了几个问题。但这里是:

So please show how to achieve a direct conversion between java type (primitive and wrapped). I'm not talking about arrays and other stuff contained in 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()

type mapping rules are applied incompletly:

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

中所述

There is no mapping between Java's wrapper classes like java.lang.Integer or java.lang.Boolean and Ceylon basic types,

包装类 - 未映射。

(编辑:OP 在有关 ceylon.language::Integer 的问题中进行了编辑……这不是 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) code>,因为原始类型 int 已映射,但包装类 java.lang.Integer 未映射。这正是文档告诉您的内容。

Could you please give a full documentation of the differences between the original java.lang and the java.lang as seen from ceylon?

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

How can I get the complete documentation of java.base as seen from ceylon (when not working in eclipse), generating one from reflection... ?

我不认为这是可用的,尽管它可能会有用......

关于java - Java的包装类和Ceylon基本类型之间的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38692699/

相关文章:

java - 读取文件到最后

java - 如何发出仅更新提供的字段的 POST 请求?

maven - 如何在 ceylon 模块描述符中应用 'maven:' 前缀

java - 相当于 Ceylon 中的 Java "static"关键字

java - 在不知道图像路径的情况下将图像添加到 JTooltip(由于图像是临时资源)

java - 仅当在一定时间内检测到信标时才显示通知

java - 使用 Selenium Webdriver 时如何打开通常的 chrome 或 Firefox 窗口?

ceylon - 追加到 ceylon 语序列

java - Ceylon 和 Java 之间的互操作性 : How to share an import from 'ceylon.language'

ceylon - 如何将扩展 Java 类的 Ceylon 类转换为 Java 类