Сеть обещаний Jquery

Суть вопроса такова:

И почему это прекрасно для метода println () для вызова его toString, но не для меня непосредственно?

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
}
13
задан hippietrail 12 August 2012 в 17:35
поделиться