用泛型重载Java中的方法
我想知道是否有可能通过改变泛型参数来重载方法。例如:用泛型重载Java中的方法,java,overloading,Java,Overloading,我想知道是否有可能通过改变泛型参数来重载方法。例如: class Foo <T> { ... } class Bar { public void do (Foo<Integer> obj) {} public void do (Foo<Double> obj) {} } class Foo{…} 分类栏{ 公共无效do(Foo obj){} 公共无效do(Foo obj){} } 我知道这不会被编译。但是,例如在kotlin中,您有注释JvmNa
class Foo <T> { ... }
class Bar {
public void do (Foo<Integer> obj) {}
public void do (Foo<Double> obj) {}
}
class Foo{…}
分类栏{
公共无效do(Foo obj){}
公共无效do(Foo obj){}
}
我知道这不会被编译。但是,例如在kotlin中,您有注释JvmName,您可以在其中注释这些方法以编译代码。Java也有这种可能性吗 同一类型中不能有两个具有相同擦除的方法。也就是说,您可以操作保留相同类型的擦除。例如,如果
Foo
是一个接口:
interface Foo<T> { /* ... */ }
class Bar {
public void do_(Foo<Integer> obj) { }
public <A extends Object & Foo<Double>> void do_(A obj) { }
}
接口Foo{/*…*/}
分类栏{
公共无效(Foo obj){}
公共无效(A obj){}
}
但是,即使不涉及泛型,也要避免重载方法。否。类型擦除
Foo
变为Foo
,因为它必须。正确的处理方法是处理Foo
,并在必要时区分方法中的类型。不,这在java中是不可能的。从注释中,我怀疑注释重命名了字节码中的方法,从而使调用明确无误。我建议重命名这些方法,使它们的名称彼此不同。Java泛型有缺陷,不如C#中使用的泛型那么健壮。@HovercraftFullOfEels这是向后兼容的代价。C#不必做出这样的选择。因此,对于访问者设计模式来说,为了实现双重分派,使用重载方法是不好的?介意详细说明一下你的最后一句话吗?我认为方法重载是Java等语言的一个关键(也是有用的)特性…@HovercraftFullOfEels访问者模式?是的,像在动态类型语言中一样使用有意义的名称。它的好处是,它意味着不必固定到所遍历的层次结构的一个表示的类型。