2016-02-02 5 views
0

Насколько я узнаю, с примером Integer Autoboxing использование является:путаница Autoboxing использование генериков

Integer iOb2 = 88; // auto-boxing 
Integer iOb = new Integer(88) // is it auto-boxing ? I think no 
           // if it is auto-boxing what about above line? 

Вышеприведенные фрагмент кода работает. Однако вы могли бы ответить на вторую строчку, будь то авто-бокс? С дженериками я не мог получить ожидаемый результат.

// A very simple generic class. 
// Here, T is a type parameter that 
// will be replaced by a real type 
// when an object of type Gen is created. 
class Gen<T> { 
    T ob; // declare an object of type T 

    // Pass the constructor a reference to 
    // an object of type T. 
    Gen(T o) { 
    ob = o; 
    } 

    // Return ob, which is of type T. 
    T getob() { 
    return ob; 
    } 
} 

// Demonstrate the generic class. 
class HelloWorld { 
    public static void main(String args[]) { 
    // Create a Gen reference for Integers. 
    Gen<Integer> iOb; 
    Integer iOb2; 
    // Create a Gen<Integer> object and assign its 
    // reference to iOb. Notice the use of autoboxing 
    // to encapsulate the value 88 within an Integer object. 
    //iOb = 88; //error 
    iOb2 = 88; 

    // Get the value in iOb. Notice that 
    // no cast is needed. The type is already known. 
    //int v = iOb.getob(); 
    System.out.println("value: " + iOb2); 

    System.out.println(); 

    // Create a Gen object for Strings. 
    Gen<String> strOb = new Gen<String>("Generics Test"); 

    // Get the value of strOb. Again, notice 
    // that no cast is needed. 
    String str = strOb.getob(); 
    System.out.println("value: " + str); 
    } 
} 

Для этого обобщенного кода, поэтому не целое значения называют типа типа обертки, который Gen<Integer>? Когда это должно быть. Не так ли?

+2

«это авто-бокс? Я думаю, что нет». Вы правы. Это * бокс *, а не * auto * -boxing. Auto-boxing - это замена этого кода компиляцией времени (на самом деле это будет 'Integer.valueOf (88)', я думаю). –

ответ

0

new Integer(88) не является авто бокс - ближайший год использования будет «бокс», но это действительно просто конструкция.

В вашем втором примере кода, похоже, вы пытаетесь сделать автообъект int в свой объект Gen - это не то, как работает автоматический бокс.

Авто бокс работает только с определенными типами, определенными в языке - например int может только Autobox к Integer, а не к типу вы определяете (как Gen)

0

Integer iOb = new Integer(88); не авто-бокс, Integer принимает параметр int в одной из своих перегрузок конструктора (см. API).

Назначение iOb2 = 88 использует автоматическое боксирование, так как оно присваивает int литерал для ссылки Integer.

1

Integer iOb2 = 88 реализован компилятором как Integer iOb2 = Integer.valueOf(88). Это авто-бокс.

Integer iOb = new Integer(88) только что вы строите объект Integer. Не авто-бокс.

Авто-бокс предназначен только для автоматического преобразования примитивных типов в их эквивалентные версии Object, например. int - Integer. Все операции автоматического бокса выполняются с использованием метода valueOf(), который был добавлен в Java 5 для этой конкретной цели (исключение для Boolean, где этот метод уже существует).

Поэтому iOb = 88 не действует, потому что 88 является int и не уступка совместимы с Gen<Integer>.

Если вы написали iOb = new Gen<Integer>(88), то вы должны были бы создать бокс для бокса перед созданием объекта, потому что конструктору нужен Integer, но вы поставляете int.

Доказательство

Чтобы доказать, что авто-бокс использует valueOf(), я создал следующий код:

Boolean a = true; 
Character b = '1'; 
Byte  c = 1; 
Short  d = 1; 
Integer e = 1; 
Long  f = 1L; 
Float  g = 1f; 
Double h = 1d; 

Демонтаж с javap -c команды производства (пустые строки добавлены для ясности):

0: iconst_1 
1: invokestatic #19     // Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean; 
4: astore_1 

5: bipush  49 
7: invokestatic #25     // Method java/lang/Character.valueOf:(C)Ljava/lang/Character; 
10: astore_2 

11: iconst_1 
12: invokestatic #30     // Method java/lang/Byte.valueOf:(B)Ljava/lang/Byte; 
15: astore_3 

16: iconst_1 
17: invokestatic #35     // Method java/lang/Short.valueOf:(S)Ljava/lang/Short; 
20: astore  4 

22: iconst_1 
23: invokestatic #40     // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
26: astore  5 

28: lconst_1 
29: invokestatic #45     // Method java/lang/Long.valueOf:(J)Ljava/lang/Long; 
32: astore  6 

34: fconst_1 
35: invokestatic #50     // Method java/lang/Float.valueOf:(F)Ljava/lang/Float; 
38: astore  7 

40: dconst_1 
41: invokestatic #55     // Method java/lang/Double.valueOf:(D)Ljava/lang/Double; 
44: astore  8