2

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

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

模块.锡兰:

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

运行锡兰:

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 ??? 

再次引用锡兰:互操作 / 陷阱!

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 中工作时),从反射生成一个...?

4

1 回答 1

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 基本类型)之间没有映射,

包装类 - 未映射。

(编辑: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)to映射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 中工作时),从反射生成一个...?

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

于 2016-08-01T09:43:06.010 回答