Как работает приведение целочисленных типов в Java-взаимодействии?

public class Hello {
  public static void test(int i) {
    System.out.println("int");
  }

  public static void test(long l) {
    System.out.println("long");
  }
}


user=> (def foo 1)
#'user/foo

user=> (type foo)
java.lang.Long

user=> (Hello/test 1)
long
nil

user=> (Hello/test foo)
int
nil

user=> (Integer. 1)
1

user=> (Integer. foo)
1

user=> (Short. 1)
IllegalArgumentException No matching ctor found for class java.lang.Short  clojure.lang.Reflector.invokeConstructor (Reflector.java:183)

Я не мог понять правила.


person alice    schedule 16.04.2013    source источник


Ответы (1)


Короче говоря, у Clojure не такое перегрузочное поведение, как у Java. Это другой язык (который работает на JVM) со своим собственным набором правил. Таким образом, если вы определите метод test(short s), он будет работать, потому что у вас есть определенная сигнатура метода соответствия, но в противном случае компилятор Clojure не будет выполнять расширяющее преобразование к «ближайшему» методу.

Более подробное обсуждение со ссылками см. в моем ответе на этот вопрос: Clojure разрешение перегруженного метода для лонгов

person noahlz    schedule 16.04.2013
comment
Почему (Hello/test foo) выбирает перегрузку int? Почему (Short. 1) терпит неудачу, а (Integer. 1) удается? Нет официальной документации по всем правилам? Должен ли я читать исходный код компилятора? - person alice; 17.04.2013
comment
Прочитайте этот пост Рича Хики, связанный с моим другим ответом: groups .google.com/forum/#!msg/clojure/7-hARL5c1lI/ntnnOweEGfUJ - person noahlz; 17.04.2013
comment
Что касается документации: dev.clojure.org/display/doc/Documentation+for +1.3+Числа — обратите внимание, что поведение может зависеть от вашей версии Clojure. - person noahlz; 17.04.2013