Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用泛型重载Java中的方法_Java_Overloading - Fatal编程技术网

用泛型重载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访问者模式?是的,像在动态类型语言中一样使用有意义的名称。它的好处是,它意味着不必固定到所遍历的层次结构的一个表示的类型。