我最近发现您可以在单个类型参数绑定中指定多个类型(请参阅示例)。与任何新工具一样,我一直在尝试探索如何使用(和滥用)它的可能性。我精心设计了这个例子来帮助说明。
在下面的示例中,编译器给我一个错误
调度(新 AlphabetSoup());
方法dispatch(Demo.Soup)对于类型Demo来说不明确
我可以理解这一点,因为任一方法签名都匹配。我的问题是如何在不改变方法的情况下解决这个问题?如果我想强制调用 Soup 版本,我可以向下转换为 Soup:
调度((汤)新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();
}
}
--
编辑:刚刚了解到“多个有界类型参数正式称为“交叉类型”
请注意,该错误与泛型无关,如果使用接口并且类型是交集,则会得到相同的结果:
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 扩展 XX”和“XY 实现 YY”,编译器可以推断出要调用的正确方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)