Суть вопроса такова:
И почему это прекрасно для метода println () для вызова его toString, но не для меня непосредственно?
blockquote >
ClassCastException
исключение не происходит из-за вызоваtoString()
, но из-за явного приведения, добавленного компилятором.Изображение стоит тысячи слов, поэтому давайте посмотрим на некоторый декомпилированный код .
Рассмотрим следующий код:
public static void main(String[] args) { List<String> s = new ArrayList<String>(); s.add("kshitiz"); List<Integer> i = new ArrayList(s); System.out.println(i.get(0)); //This works System.out.println(i.get(0).toString()); // This blows up!!! }
Теперь посмотрим на декомпилированный код:
public static void main(String[] args) { ArrayList s = new ArrayList(); s.add("kshitiz"); ArrayList i = new ArrayList(s); System.out.println(i.get(0)); System.out.println(((Integer)i.get(0)).toString()); }
См. явное приведение к
Integer
? Теперь почему компилятор не добавил листинг в предыдущей строке? Подпись методаprintln()
такова:public void println(Object x)
Поскольку
println
ожидаетObject
, а результатi.get(0)
равенObject
, никакой литой не добавляется.Также вы можете вызвать
toString()
, если вы сделали это так, чтобы не было создано ни одного акта:public static void main(String[] args) { List<String> s = new ArrayList<String>(); s.add("kshitiz"); List<Integer> i = new ArrayList(s); myprint(i.get(0)); } public static void myprint(Object arg) { System.out.println(arg.toString()); //Invoked toString but no exception }