gpt4 book ai didi

java - 如何解决由 Java 泛型中的交集类型引起的不明确方法?

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

我最近才发现您可以在单个类型参数绑定(bind)中指定多个类型(参见示例)。与任何新工具一样,我一直在尝试探索如何使用(和误用)它的可能性。我制作了这个例子来帮助说明。

在下面的示例中,编译器给我一个错误

dispatch(new AlphabetSoup());

The method dispatch(Demo.Soup) is ambiguous for the type Demo

我能理解这一点,因为两种方法签名都匹配。我的问题是如何在不改变方法的情况下解决这个问题?如果我想强制调用 Soup 版本,我可以向下转换为 Soup:

dispatch((Soup) new AlphabetSoup())

但我不确定您将如何强制调用其他版本。可能吗?

public class Demo {

interface HasA { public char getA(); }
interface HasB { public char getB(); }
interface HasC { public char getC(); }

interface Soup {
public void eat();
}

class Alphabet implements HasA, HasB, HasC {
public char getA() { return 'a'; }
public char getB() { return 'b'; }
public char getC() { return 'c'; }
}

class AlphabetSoup implements Soup, HasA, HasB, HasC {
public void eat() { System.out.println("Mmm Mmm Good!"); }
public char getA() { return 'a'; }
public char getB() { return 'b'; }
public char getC() { return 'c'; }
}

public void dispatch(Soup soup) {
System.out.println("Eating some soup...");
soup.eat();
}

public <T extends HasA & HasB & HasC> void dispatch(T letters) {
System.out.println("Reciting ABCs...");
System.out.println(letters.getA());
System.out.println(letters.getB());
System.out.println(letters.getC());
}

public void test() {
dispatch(new Alphabet());
dispatch(new AlphabetSoup());
}


public static void main(String[] args) {
new Demo().test();
}
}

--编辑:刚了解到“多个有界类型参数正式称为“交集类型”

最佳答案

请注意,该错误与泛型无关,如果您使用接口(interface)并且类型是交集,您会得到相同的结果:

public class AA {

interface XX{};
interface YY{};

public void doSomething(XX x){}
public void doSomething(YY x){}

class XY implements XX,YY{

}

public void runner(){
doSomething(new XY());
}
}

你在“doSomething”中遇到同样的错误,编译器无法解决歧义。您要解释为 XX 还是 YY?你必须用类型转换来指定它。但是如果你有一个层次结构,比如“YY extends XX”和“XY implements YY”,编译器可以推断出正确的方法来调用。

关于java - 如何解决由 Java 泛型中的交集类型引起的不明确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/815771/

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