gpt4 book ai didi

java - 尝试使用它们时,同一调用中的两个泛型方法是否会导致编译错误?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:59:38 26 4
gpt4 key购买 nike

我读了 Deital 的书:“Java How To Program”,在 Generic Chapter 中写道:“如果编译器没有找到与方法调用完全匹配的方法声明,但是确实找到了两个或多个可以满足方法调用的方法,就会出现编译错误”。有人可以给我一个情况的例子,因为当我没有成功得到上面的编译错误时。我的代码:

public class Animal
{
public Animal ()
{

}

public String bark()
{
return "Animal";
}
}

public class Dog extends Animal
{
public String bark()
{
return "howhow";
}
}

public class DogSon extends Dog
{
public String bark()
{
return "I'm Dog Son";
}
}

public class Test
{
public static void main(String[] args)
{
Test t = new Test();
DogSon d = new DogSon();
System.out.println(t.helpMethod(d));
}

public <T extends Dog> String helpMethod(T dog)
{
System.out.println("aaa");
return dog.bark();

}
public <T extends Animal> String helpMethod(T animal)
{
return animal.bark();
}
}

由于没有方法可以准确地获取子对象,因此有两种通用方法可以适用于此。这不就是Deital所说的情况吗?

最佳答案

不完全是;在您的示例中,T dog变体比 T animal 更具体变体,因此,它是被选中的那个。

我不能保证我知道作者指的是什么。但我可以猜到:

public class Example<T> {
public void m(T arg) {
// At compile time, 'T', as it has a lower bound of Object,
// is treated as Object. Its signature therefore does not clash
// with the next m, and thus this can be compiled.
System.out.println("T-based");
}

public void m(Dog arg) {
System.out.println("Dog-based");
}
}

new Example<Dog>().m(new Dog()); // this line causes a compiler error.

产生的错误是:

Animal.java:16: error: reference to m is ambiguous
new Example<Dog>().m(d);
^
both method m(T) in Example and method m(Dog) in Example match
where T is a type-variable:
T extends Object declared in class Example
1 error

那么,这里发生了什么:在编译时(Example.java 本身),两个 m方法还不一定是模棱两可的;在大多数情况下,T-variant 被视为等于其下限(因此,Object),在 java 中你可以有一个 m(Object arg)。和一个 m(Dog arg)在同一个类(class),没问题。

但是,在泛型之后,2 m有效的方法确实会发生冲突:它们现在都将 Dog 类型的任何内容作为参数.因此,不再可能在任何 new Example<Dog> 上调用任何一个 m 方法。 .当涉及泛型并且类型参数可能重叠时,正确的解决方案是不要重载(这就是当您有 2 个具有相同名称的不同方法时调用的方法)。据推测,您书中该部分的作者试图告诉您为什么在这种情况下您永远不应该重载。

关于java - 尝试使用它们时,同一调用中的两个泛型方法是否会导致编译错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58486950/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com