【问题标题】:Mapping between Java's wrapper classes and Ceylon basic typesJava 的包装类和 Ceylon 基本类型之间的映射
【发布时间】:2016-08-06 02:39:11
【问题描述】:

当一个 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 和 ceylon 之间存在转换。但代价高昂:java类型之间的直接转换(cast或parse)丢失了。

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

在 java.lang api 中很难找到,因为类型映射规则应用不完整:

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

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

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

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

【问题讨论】:

    标签: java ceylon


    【解决方案1】:

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

    所以请展示如何实现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 基本类型之间没有映射,

    包装类 - 未映射。

    (编辑: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),因为基本类型 int 已映射,但包装类 java.lang.Integer 未映射。这正是文档告诉您的内容。

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

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

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

    我不认为这是可用的,虽然它可能会有用......

    【讨论】:

    • ... 如何将 vom java String 解析为 java int?
    • ... 澄清“映射”的含义可能很重要。 Eclipse 中的工具提示显示来自 java.lang 的带有锡兰类型的签名,这看起来很奇怪。人们会期待原版,然后是自动演员表。我认为告诉人们没有强制转换会更好——相反,java.base 适应了锡兰环境,没有类型强制转换的可能性。
    • @user3464741 要么 JInteger.parseInt(jstring.string) 要么使用 Ceylon 的 parseInteger() 函数和 assert 结果到 Integer
    • “映射”表示:Java 类型 int 在 Ceylon 中不存在。当它出现在 Java 签名中时,我们用 Ceylon 类型 ceylon.language::Integer 表示它。当你说你期待“原版”时……那会是什么? int 在锡兰不存在。这就是为什么它必须映射到确实存在的 Ceylon 类型 - ceylon.language::Integer
    猜你喜欢
    • 2012-02-20
    • 2011-05-25
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 2023-03-09
    • 2012-05-31
    • 1970-01-01
    • 2012-06-09
    相关资源
    最近更新 更多