非publicでAbstractかつGenericなクラスのGenericなメソッドが呼べない模様

さらに、前々回の続きです・・・

簡単な検証クラスをかいて、問題のパターンを実験してみた。

AbsClass.java

abstract class AbsClass<T> {
  public void message(T mes) {
    System.out.println("Hello " + mes + "!!");
  }

  public void hello() {
    System.out.println("Hello!!");
  }
}

ChildClass.java

public class ChildClass extends AbsClass<String> {}


まずはコンパイルして・・・

$javac AbsClass.java
$javac ChildClass.java


でもって、実験してみると・・・

user=> (import ChildClass) 
ChildClass
user=> (. (new ChildClass) hello)
Hello!! 
nil
user=> (. (new ChildClass) message "World")
java.lang.IllegalArgumentException: Can't call public method of non-public class: public void AbsClass.message(java.lang.Object) (NO_SOURCE_FILE:0)

思った通りうまくいかない。


一応Scalaでは・・・

scala> (new ChildClass).hello
Hello!!

scala> (new ChildClass).message("World")
Hello World!!

のように問題ない。

結論としては、
「現在の Clojure(ver 1.1.0) は AbstractかつGenericなクラス の Genericなメソッドが呼べない模様」
と言うことになると思われる。


【追記】

AbsClassをpublicにすれば問題なくなった。

public abstract class AbsClass<T> {
 :
}

したがって、正確には
「現在の Clojure(ver 1.1.0) は 非publicでAbstract且つGenericなクラス の Genericなメソッドが呼べない模様」
です。