Вызов функции верхнего уровня Ceylon с параметрами типа из Java (или scala)

С

shared T f<T>(T t){
  return t;
}

Я ожидал что-то вроде

mod.f_.f[Integer](1)

для работы в scala, где [Integer] — параметр типа. Но он не принимает параметры типа.

И почему scala видит геттер вместо функции для

shared Integer(Integer) fi = f<Integer>;

Я ожидал, что Integer (Integer) будет достаточно, чтобы сообщить компилятору, что нужно предоставить функцию для scala.


person Michael    schedule 17.04.2017    source источник


Ответы (2)


Я не знаю Scala, поэтому могу помочь только с частью Java, но вот как вы вызываете эту функцию из Java:

f_.f(Integer.$TypeDescriptor$, Integer.instance(1))

or:

f_.<Integer>f(Integer.$TypeDescriptor$, Integer.instance(1))

В Ceylon представлены овеществленные дженерики, поэтому параметры типа превращаются в обычные параметры, и вы должны предоставить объекты дескриптора типа для аргументов типа. Классы и интерфейсы Ceylon имеют статический член $TypeDescriptor$, который вы можете использовать для этого; Я не знаю, как другие вещи (классы Java, типы объединения и пересечения и т. д.) работают у меня в голове, но вы можете написать эквивалентный вызов на Ceylon и посмотреть на сгенерированный код Java, скомпилировав его с помощью --verbose=code.

Вот полный рабочий пример с вашей функцией f и вызывающим ее классом Java G:

person Lucas Werkmeister    schedule 17.04.2017
comment
@Michael Вы можете использовать TypeDescriptor.klass(Whatever.class), чтобы получить TypeDescriptor для класса Java или Scala Whatever. - person Gavin King; 18.04.2017

Предполагается, что Ceylon отвечает требованиям безопасности типов и безопасно обрабатывает нулевые значения. Но это не во время выполнения.

Итак, есть очень простой ответ на вопрос:

scala> mod.f_.f(null,3).

Это действительно смешно.

Конечно, есть и другие способы развлечься:

scala> implicit def f(x:Any):com.redhat.ceylon.compiler.java.runtime.model.TypeDescriptor = com.redhat.ceylon.compiler.java.runtime.model.TypeDescriptor.klass(x.getClass)

scala> mod.f_.f(List(),3)
scala> mod.f_.f(List,3)
scala> mod.f_.f(Float,3)
...
person Michael    schedule 18.04.2017
comment
Как вы ожидаете, что Ceylon будет обрабатывать нулевое значение более безопасным способом? Система типов Ceylon применяется во время компиляции, а не во время выполнения при доступе к функции Ceylon из-за пределов Ceylon. - person Paŭlo Ebermann; 18.04.2017
comment
Как вы ожидаете, что пользователь будет безопасно обрабатывать null здесь? Например. Программно! - person Michael; 21.04.2017