【发布时间】:2017-09-18 02:33:13
【问题描述】:
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# 的泛型真的可以实现和鸭子类型一样的功能吗?
谢谢。
【问题讨论】:
-
(不是很有帮助,但作为一个琐事,C# 编译器使用鸭子类型实现
foreach- 您可以 foreach 任何具有所需方法的东西,没有接口要求。)
标签: java c# generics programming-languages duck-typing