Почему компилятор пытается Wide и Box Почему не Box и Wide? - PullRequest
2 голосов
/ 25 января 2010

При вызове определенного метода я читал, что Wide и Box предпочтительнее, почему не Box и Wide. Может кто-нибудь объяснить мне, почему с одним небольшим примером.

Ответы [ 3 ]

7 голосов
/ 25 января 2010

Расширение: вызов метода с более узким типом параметра.

public class Test {
    static void doIt(long l) { }
    public static void main(String[] args) {
        int i = 1;
        doIt(i); // OK: int i is widened to long
    }
}

Бокс: вызов метода, который принимает тип оболочки с примитивным аргументом.

public class Test {
    static void doIt(Integer i) { }
    public static void main(String[] args) {
        int i = 1;
        doIt(i); // OK: int i is boxed to Integer
    }
}

Расширение, а затембокс: не работает.

public class Test {
    static void doIt(Long l) { }
    public static void main(String[] args) {
        int i = 1;
        doIt(i); // FAILS. Cannot widen int to long and then box to Long
    }
}

Бокс, а затем расширение: работает только при расширении до супертипа.

public class Test {
    static void doIt(Number n) { }
    static void go(Long l) { }
    public static void main(String[] args) {
        int i = 1;
        doIt(i); // OK. i is boxed to Integer, and Number is a supertype of Integer
        go(i); // FAILS: Long is not a supertype of Integer
    }
}
2 голосов
/ 25 января 2010

Ответ довольно прост: вы можете расширять только примитивы. Следовательно, компилятор должен расширяться до появления прямоугольников.

0 голосов
/ 25 января 2010

Из учебного материала SCJP я могу сказать вам следующее:

Когда вызывается метод, в этом порядке будет проверяться следующее, и если найдено совпадение, будет вызван соответствующий метод:

1) Widening (preferred: 1st option to be chosen)
2) Boxing
3) Var args

Так оно и есть! Следи за порядком!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...