非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なメソッドが呼べない模様」
です。