歧义错误

添加泛型之后带来了一种新的错误类型-歧义(ambiguity),对此应该警惕.当擦除特性导致两个明显不同的泛型声明被解析为相同的擦除类型,进而导致冲突时,就会产生歧义错误.下面是一个方法重载产生歧义的示例:
class MyGenClass<T,V>
{
    T ob1;
    V ob2;
    
    void set(T o)
    {
        ob1 = o;
    }
    
    void set(V o)
    {
        ob2 = o;
    }
}
注意,MyGenClass声明了两个泛型类型:T和V.在MyGenClass内部试图基于T和V类型的形参来重载set().这样做看似合理,因为T和V好像是不同的类型.但是,这里存在两个歧义问题.
首先,编写的MyGenClass并没有要求T和V是两种实际不同的类型,例如,按照如下所示的形式构造MyGenClass对象(从理论上讲)是完全合理的.
MyGenClass <String,String> obj = new MyGenClass<String,String>()
本例中,T和V都被替换成String,这使得两个版本的set()相同,当然会导致错误.其次,更主要的是,set()的类型擦除把两个版本的方法都缩减为:
void set(Object o)
因此,在MyGenClass中试图重载set()会导致歧义,在这种情况下的解决方案是使用两个独立的方法名称,而不是重载set()