1。什么是歧义错误?
2。歧义示例:擦除过载
有问题的代码:
class MyGenClass<T, V> { T ob1; V ob2; // Tentativa de sobrecarga void set(T o) { ob1 = o; } void set(V o) { ob2 = o; } }
错误: 尝试根据泛型参数 T 和 V 重载 set() 方法看似有效,但会导致歧义。
3。歧义的原因
示例:
MyGenClass<String, String> obj = new MyGenClass<>();
这里,T 和 V 都被 String 替换,使得两个版本的 set() 相同。
结果:
第二个问题:擦除将类型减少为对象。
void set(Object o) { // ... }
这消除了 T 和 V 之间的任何区别,使得 不可能重载。
4。为什么会发生这种情况?
5。解决方案:避免泛型过载
要解决歧义,请使用方法的不同名称。
更正示例:
class MyGenClass<T, V> { T ob1; V ob2; void setOb1(T o) { ob1 = o; } void setOb2(V o) { ob2 = o; } }
这里,setOb1() 和 setOb2() 是不同的方法,消除了冲突。
6。结论
出现这样的歧义是因为擦除将通用参数转换为简单类型(对象)。
为避免错误,请遵循以下做法:
以上是泛型的歧义错误的详细内容。更多信息请关注PHP中文网其他相关文章!