2016-11-28 6 views
0

Я немного запутался в этом коде, это тест, чтобы понять параметрический класс.Параметрический класс в Java

У меня есть 2 класса, один из них является основным, а другой - параметрическим. Когда я создаю новый Object с Integer как параметр, и я думаю, что в конструкторе будет вызван метод print (Integer x), но это не так, вместо этого java вызовет метод print (Object o).

Кто-то из вас знает, почему это произошло?

package classi.parametriche; 

public class Contenitore <E> { 
public E variabile; 

public Contenitore(E value){ 
    variabile = value; 
    System.out.println("Variabilie : "+variabile.getClass().toString()); 
    System.out.println("Variabile : "+value.getClass().toString()); 
    println(variabile); 
} 
public void println(String s){ 
    System.out.println("Stringa : "+ s); 
} 
public void println(Integer x){ 
    System.out.println("Int : " + x); 
} 
public void println(short x){ 
    System.out.println("short : " + x); 
} 
public void println(byte x){ 
    System.out.println("byte : " + x); 
} 
public void println(long x){ 
    System.out.println("long : " + x); 
} 
public void println(char x){ 
    System.out.println("char : " + x); 
} 
public void println(float x){ 
    System.out.println("float : " + x); 
} 
public void println(double x){ 
    System.out.println("double : " + x); 
} 
public void println(Object o){ 
    if (o != null){ 
     System.out.println("Object : " + o.toString()); 
    }else{ 
     System.out.println("null"); 
    } 
} 

}

public class ClassiParametriche { 
    public static void main(String[] args) { 
     Contenitore<Integer> c = new Contenitore <Integer>(42); 

    } 
} 

это результат:

run: 
Variabilie : class java.lang.Integer 
Variabile : class java.lang.Integer 
Object : 42 
+1

Возможная дубликация [Перегрузка на Java и множественная отправка] (http://stackoverflow.com/questions/9759141/overloading-in-java-and-multiple-dispatch) – Smutje

+3

Средства Generic доступны только для компиляции. После того как код Java скомпилирован в .class-файл, общие свойства, например параметры для класса, стираются, то есть во время выполнения у вас есть только объект. – vvtx

+1

Посмотрите на стирание стилей. Общий «E» известен только как «Object» во время выполнения. –

ответ

0

Это из-за type erasure и время компиляции связывания.

Компилятор решает во время компиляции, какой из методов println вызывается. Поскольку поле вашего класса является общим без определенного суперкласса, оставшимся типом после стирания типа является Object. Это означает, что переменная поля внутренне обрабатывается как объект.

Вы также можете проверить сообщение this.

+0

Да, я понял это меньше, чем 5 минут назад, спасибо за ваш быстрый ответ :) Я был в замешательстве, потому что, когда сначала я контролировал «тип класса», я видел имя Integer, и я не думал, что этот метод может принадлежать Объект –

-1

Ответ типа стирание. Во время выполнения класс не имеет типа параметра. Дженерики в Java - это чисто компиляторный сахар. После компиляции кода он теряет знания о соответствующем типе параметров. Поэтому, когда вы передаете Integer в конструктор, конструктор фактически ожидает переменную типа java.lang.Object

+1

Это не имеет никакого отношения к стиранию стилей, поскольку используемый перегруженный метод выбирается во время компиляции, а не во время выполнения. –

Смежные вопросы