2016-08-01 7 views
2

Когда модуль ceylon импортирует «java.base» «8», он не видит исходные классы java.lang, но получает что-то еще.Сопоставление между классами оболочки Java и базовыми типами Ceylon

Так что, когда я хочу, чтобы синтаксический анализ из строки java в целое число java, я должен вывести строку java в строку ceylon и затем проанализировать ее в java integer.

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.lang.Integer или java.lang.Boolean и Ceylon, , поэтому эти преобразования должны выполняться явно, вызывая, например, intValue() или booleanValue(), или явно , создавая экземпляр класса-оболочки, как и в Java при преобразовании между примитивным типом Java и его классом-оболочкой. "

Так что, будучи сложным, он все еще работает. Но что я могу сделать, когда хочу прямое преобразование между типами Java, не связанными с String.

Это вызывает проблему, потому что нет простого аналога t.string в ceylon, например. нет «t.int» или «t.float».

Итак, есть конверсия между java и ceylon. Но цена высокая: прямое преобразование (литье или разбор) между типами Java теряется.

Итак, пожалуйста, покажите, как достичь прямого преобразования между java-типом (примитивным и обернутым). Я не говорю о массивах и других материалах, содержащихся в ceylon.interop.java.

Это не легко найти вокруг в java.lang API, потому что правила отображения типа применяется incompletly:

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

С одной стороны, «valueOf» ожидает ввод Цейлона, но с другой стороны, возвращает значение java. Почему не то же самое, что в исходном java.lang, т. Е. Только преобразование типов java? Существуют ли интуитивные правила?

Не могли бы вы дать полную документацию о различиях между оригинальным java.lang и java.lang, как видно из ceylon?

Как я могу получить полную документацию java.base, как видно из ceylon (когда не работает в eclipse), генерируя ее из отражения ...?

ответ

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().

правила отображения типа применяются incompletly:

Они не являются. Правила таковы: j.l.String и примитивные типы (int, double и т. Д.) Сопоставляются с их эквивалентами на Цейлоне. Все остальные типы - в том числе, как указано в

Там нет соответствия между классами оберток Явы как java.lang.Integer или java.lang.Boolean и Цейлон основных типов,

классы-оболочки - не отображаются.

(EDIT:.. О.П. отредактирован в вопросе о ceylon.language::Integer ... это не тип Java, ни тип обертка Это именно то, что он есть)

Java-подпись java.lang.Integer valueOf(java.lang.String) поэтому отображается в подписи Цейлон 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, как видно из ceylon?

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

Как я могу получить полную документацию java.base, как видно из Цейлона (когда не работает в затмении), создавая один из отражения ...?

Я не думаю, что это доступно, хотя это, вероятно, будет полезно ...

+0

... и как я могу разобрать строку Java вом для Java межд? – Michael

+0

... и, вероятно, важно уточнить, что означает «сопоставление». Странно, что всплывающие подсказки в eclipse показывают подписи из java.lang с типами ceylon. Можно было бы ожидать оригинального, а затем автоматического броска. Я думаю, было бы лучше сказать людям, что нет отливки - вместо этого java.base адаптируется к ceylon среде без возможности кастования типов. – Michael

+1

@ user3464741 либо 'JInteger.parseInt (jstring.string)', либо использовать функцию 'parseInteger()' Ceylon и 'assert' результат до' Integer'. –

 Смежные вопросы

  • Нет связанных вопросов^_^