Обычно, когда вы вызываете конструктор или метод, для которого могут применяться несколько переопределенных версий, Java выберет наиболее конкретный конструктор или метод. Раздел 15.12.2 Спецификации языка Java объясняет это подробно.
Предположим, у вас есть два перегруженных метода, например:
public void method(Object o) {
// ...
}
public void method(String s) {
// ...
}
Когда вы вызываете method(null)
, оба эти метода применяются.Java выбирает наиболее конкретный, который в данном случае является вторым методом, который принимает String
- потому что String
является более конкретным типом, чем Object
.
Однако иногда самый специфический конструкторили метод не может быть определен.Если мы посмотрим на конструкторы класса String
, которые принимают один аргумент:
String(byte[] bytes)
String(char[] value)
String(String original)
String(StringBuffer buffer)
String(StringBuilder builder)
Обратите внимание, что между типами byte[]
, char[]
, String
, StringBuffer
и нетStringBuilder
, поэтому нельзя сказать, что один из этих конструкторов более специфичен, чем другие.Таким образом, компилятор Java не знает, какой конструктор выбрать, и выдаст ошибку.