Это общий автобокс?

Присвоение значений без использования обычных обозначений типа «this. ‹Double› getAnything (int flag)»

private <T> T getAnything(int flag) {
    Object o = null;
    if (flag==0)
        o=new String("NewString");
    else if (flag==1)
        o=new Double(0D);
    return (T)o;
}


private void someMethod() {
    String s = getAnything(0);
    Double d = getAnything(1);
}

в прошлом было достаточно только возвращаемого объекта в методе и простого приведения к принимающему типу, поэтому из-за отсутствия общей нотации для объекта-получателя он стал намного более похожим и быстрым для записи, любой другой намек на это?


person Steel Plume    schedule 10.07.2010    source источник
comment
Я не понимаю, какое отношение автобокс имеет к этому коду. Если вы можете прокомментировать это, я могу уточнить и, надеюсь, прояснить любую путаницу.   -  person polygenelubricants    schedule 10.07.2010
comment
Никогда не используйте new String("hello") в Java. Просто напишите "hello" - это уже String объект. Нет необходимости создавать еще String объект.   -  person Jesper    schedule 10.07.2010


Ответы (2)


Я думаю, вы путаете автобокс с выводом типа.

Вывод типа - это когда компилятор может определить, какой тип он должен использовать в универсальном методе самостоятельно, на основе переменных, используемых при вызове метода.

Например, если у вас есть следующий метод:

public <T extends SomeClass> T process(T obj) {
    // call some methods of SomeClass on obj to process it here
    return obj;
}

а затем назовите это так:

SomeChildClass a = new SomeChildClass(); // SomeChildClass extends SomeClass
a = process(a);

предполагаемый тип будет SomeChildClass;

Тип может быть выведен из параметров или из возвращаемого типа, как в вашем примере. Но компилятору не всегда очевидно, какой тип он должен использовать. Если это произойдет, вы можете принудительно установить тип, используя метод this.<Double>getAnything(int flag), который вы описали. Обычно это происходит в таких ситуациях:

public <T> List<T> getSomeList() {
    // implementation
}

public void processList(List<SomeClass> list) {
     // implementation
}

и звонит

processList(getSomeList()); // compiler error: cannot convert List<Object> to List<SomeClass>

В таких случаях вам может потребоваться принудительно указать параметр типа.

При всем этом, пожалуйста, примите во внимание все, что сказано в polygenelubricants, так как он делает несколько очень хороших замечаний относительно вашего кода и объясняет, что такое автобоксинг (это связано с примитивными классами-оболочками, такими как Integer для int и Double для double).

person Andrei Fierbinteanu    schedule 19.07.2010

О безопасности

Непонятно, что вы пытаетесь сделать, но следует отметить, что в вашем коде нет никакой безопасности типов.

Double d = getAnything(0);
// compiles fine, but throws ClassCastException at run time

Это в первую очередь противоречит цели использования дженериков.

Вы внесли эту небезопасность, когда написали это заявление:

return (T)o; // warning: Type safety: Unchecked cast from Object to T

Связанные вопросы

Смотрите также

  • Эффективное 2-е издание Java, пункт 24. Устранение непроверенных предупреждений

О типовом безопасном гетерогенном контейнере

Возможно, вам нужно что-то вроде того, что Джош Блох называет безопасным гетерогенным контейнером. Вот цитата из блога Нила Гафтера:

Вот простой, но полный пример API, использующего токены типов в шаблоне THC, из выступления Джоша на JavaOne 2006 года:

public class Favorites {

    private Map<Class<?>, Object> favorites =
        new HashMap<Class<?>, Object>();

    public <T> void setFavorite(Class<T> klass, T thing) {
        favorites.put(klass, thing);
    }
    public <T> T getFavorite(Class<T> klass) {
        return klass.cast(favorites.get(klass));
    }

    public static void main(String[] args) {
        Favorites f = new Favorites();
        f.setFavorite(String.class, "Java");
        f.setFavorite(Integer.class, 0xcafebabe);

        String s = f.getFavorite(String.class);
        int i = f.getFavorite(Integer.class);
    }
}

С этим шаблоном вы получаете безопасность типов; int i = f.getFavorite(String.class); НЕ компилируется (и это хорошо!).

Смотрите также


Об автобоксе

Автобоксирование - это неявное преобразование, скажем, примитива int в ссылочный тип Integer; автоунбоксинг - это обратное преобразование. Вопрос, как указано, не имеет ничего общего с автобоксом.

Смотрите также

Связанные вопросы

person polygenelubricants    schedule 10.07.2010