2

ceylon モジュールが "java.base" "8" をインポートすると、元の java.lang クラスは表示されませんが、別のものを取得します。

したがって、Java 文字列から Java 整数への解析が必要な場合は、Java 文字列をセイロン文字列にキャストしてから、それを Java 整数に解析する必要があります。

モジュール.セイロン:

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 を引用しています。:

java.lang.Integer や java.lang.Boolean などの Java のラッパー クラスと Ceylon の基本型の間にはマッピングがないため、これらの変換は、intValue() や booleanValue() などを呼び出すか、明示的にインスタンス化することによって明示的に実行する必要があります。 Javaプリミティブ型とそのラッパークラスの間で変換するときにJavaで行うのと同じように、ラッパークラス。」

そのため、複雑ではありますが、それでも機能します。しかし、String を含まない Java タイプ間の直接変換が必要な場合はどうすればよいでしょうか。

これは問題を引き起こします。なぜなら、セイロンには t.string に単純な類似物がないからです。たとえば、"t.int" や "t.float" はありません。

したがって、java と ceylon の間の変換があります。ただし、代償は高くなります。Java 型間の直接変換 (キャストまたは解析) が失われます。

したがって、Java タイプ (プリミティブとラップ) 間の直接変換を実現する方法を示してください。私は配列や ceylon.interop.java に含まれるその他のものについて話しているのではありません。

タイプ マッピング ルールが不完全に適用されているため、java.lang API を見つけるのは簡単ではありません。

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

一方では「valueOf」はセイロン入力を想定していますが、他方では Java 値を返します。元の java.lang と同じ、つまり Java 型のみの変換ではないのはなぜですか? 直感的なルールはありますか?

セイロンから見た元の java.lang と java.lang の違いの完全なドキュメントを教えてください。

ceylon (Eclipse で動作していない場合) から見た java.base の完全なドキュメントを取得するにはどうすればよいですか?

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.lang.Integer や java.lang.Boolean などの Java のラッパー クラスと 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)intjava.lang.Integer

セイロンから見た元の java.lang と java.lang の違いの完全なドキュメントを教えてください。

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

ceylon (Eclipse で動作していない場合) から見た java.base の完全なドキュメントを取得するにはどうすればよいですか?

おそらく役に立つでしょうが、これは利用できないと思います…</p>

于 2016-08-01T09:43:06.010 に答える