2016-07-20 37 views
-3

Почему автобоксинг и распаковка примитивов не происходит с Generics Java.Дженерики с автобоксированием и распаковкой примитивов

public static <T extends Number> T addNumber(T a , T b) 
{ 
    int c = a*b; 
    System.out.println(c); 
    return c; 
} 

Здесь почему * операция не может быть выполнена и почему не может быть возвращена c. Любая помощь будет заметна.

ответ

0
int c = a*b; 

Это утверждение на самом деле работает, так как T ограничен Integer, поэтому после стирания, типы a и b являются Integer и они распакованные в целое.

return c; 

Это не работает, так как тип возвращаемого значения метода не Integer, это T, и несмотря на то, <T extends Integer> и Integer является final, так T может быть только Integer, компилятор не позволяет, что , так как он не принимает значение finality типа, связанного с ним (то есть, насколько это возможно, метод может принимать экземпляры подкласса связанного типа и не может автоматически помещать int в любой подтекст класс класса).

Изменение типа возвращаемого значения Integer сделает код прохода компиляции:

public static <T extends Integer> Integer addNumber(T a , T b){ 
    int c = a*b; 
    System.out.println(c); 
    return c; 
} 

Конечно, это не имеет смысла использовать Integer (или любой конечный класс) в качестве типа, связанного для общего типа параметр.

+0

Он даже не работает с Int C = A * B. – Pooja

+0

@Pooja Это для меня. Я просто попробовал. – Eran

+0

if не разрешает * b – Pooja

1

Дженерики не должны использоваться с примитивными типами. T указывает параметр типа, который должен быть объектом.
Больше ссылка
Why don't Java Generics support primitive types? Java Generics ? , E and T what is the difference?
Restrictions on generics

+0

Integer также является классом-оболочкой, и если мы выполняем операцию математики на его объекте, это разрешено. Поэтому почему бы нет, если T extends Integer – Pooja

+0

@pooja https://docs.oracle.com/javase/tutorial/ Java/генерики/restrictions.html –