http://nullprogram.com/blog/2014/04/01/ пытается чтобы объяснить, что универсальные шаблоны Java не могут имитировать утиную печать, на примере:
class Caller<T> { final T callee; Caller(T callee) { this.callee = callee; } public void go() { callee.call(); // compiler error: cannot find symbol call } } class Foo { public void call() { System.out.print("Foo"); } } class Bar { public void call() { System.out.print("Bar"); } } public class Main { public static void main(String args[]) { Caller<Foo> f = new Caller<>(new Foo()); Caller<Bar> b = new Caller<>(new Bar()); f.go(); b.go(); System.out.println(); } }
Программа выйдет из строя из-за ошибки времени компиляции. Это результат стирания типа. В отличие от шаблонов C ++, будет только одна скомпилированная версия
Caller
, аT
станетObject
. ПосколькуObject
не имеет методаcall()
, компиляция не выполняется.
Означает ли это, что в дженериках Java методы параметра типа ограничиваются методами класса java.lang.Object
?
Дженерики C # реализованы в терминах реификации вместо стирания типов. У дженериков C # нет вышеуказанного ограничения, как у дженериков Java? Так могут ли универсальные шаблоны C # достичь того же, что и утиная печать?
Спасибо.