Почему в следующем коде есть ошибка?Почему перегрузка не удалась? - PullRequest
1 голос
/ 18 декабря 2010
// signatures of the reset method at //1 and //2 after erasure will be different
// then why don't they overload?

public class Test<T>{
    public static void main(String[] args) { 
        WordBox<String> city = new WordBox<String>("Skogland"); 
        city.reset("waiting");  // error: ambiguous 
    }
}


class Box <T> { 
    private T theThing; 
    public Box( T t) { theThing = t; } 
    public void reset( T t) { theThing = t; } //1  
} 

class WordBox< S extends CharSequence > extends Box< String > {
    public WordBox( S t)    { super(t.toString().toLowerCase()); }
    public void reset( S t) { super.reset(t.toString().toLowerCase()); }  //2
}

1 Ответ

4 голосов
/ 18 декабря 2010

java.lang.String extends CharSequence, поэтому вызов city.reset("waiting") соответствует как WordBox.reset(S extends CharSequence), так и Box.reset(String).

Чтобы устранить проблему, вы должны либо убедиться, что WordBox.reset() принимает тот же тип, что и Box.reset(), в этом случае WordBox.reset() переопределяет Box.reset(), либо, наоборот, убедиться, что WordBox.reset() принимает тип, который не перекрываются с Word.reset(), в этом случае WordBox.reset() перегружает Box.reset(). В приведенном вами примере у меня возникает ощущение, что вы, вероятно, захотите, чтобы WordBox.reset() переопределил Box.reset().

...