前几天,我在与扩展方法相关的stackoverflow帖子中发现了这个语句:
主要的是能够根据不同的泛型参数实例化覆盖不同的方法。这类似于Haskell的类型类
Java equivalent to C# extension methods
这是什么意思?任何人都可以提供一个明确的例子来阐明这一陈述吗?
答案 0 :(得分:1)
我认为他们指的是C#的编译器会选择最简单定义类型的方法。例如,如果你有一个抽象类(ABS)和一个继承类(CLS2)和2个扩展方法
public static object GetStuff(this ABS obj){
blah blah blah
}
public static object GetStuff(this CLS obj){
blah blah blah
}
如果调用CLS2.GetStuff(),编译器将选择第二种方法。一旦您知道可以通过使其更具体来“覆盖”扩展方法。所以,如果你有一个通用类
public class Foo<T>{}
你可以制作2个扩展方法(使用上面的类作为类型)
public static void DoSomething(this Foo<Abs> abs){}
和
public static void DoSomething(this Foo<CLS2> abs){}
这里第二种方法是“覆盖”更“通用”的抽象类型。
这可能与C#有关,因为它实际上为每个Generic类型生成一个新类。使用类似Java的语言,它使用“Type Erasure Generics”,你不能“重载”泛型方法,因为一切都是真正的类型对象。