2015-02-14 14 views
0

Просмотр Effective Java видео я заметил, что типы штучных примитивов поддерживаются только четыре из шести операторов сравнения Wich <, >, <=, >= и не поддерживают == и !=.Почему бокс-примитивы не поддерживает всех операторов?

Мой вопрос: почему примитивы в штучной упаковке не поддерживают всех операторов?

+0

Вмещенные примитивы == обычные объекты, они уже не примитивы. – biziclop

ответ

7

Они поддерживают == и !=. Они просто не делают то, что вы ожидаете.

Для ссылок == и != сообщают вам, равны ли две ссылки, то есть относятся ли они к одному и тому же объекту.

class Thingy {} 
Thingy a = new Thingy(); 
Thingy b = new Thingy(); 
System.out.println(a == b); // prints false, because a and b refer to different objects 

Thingy c = b; 
System.out.println(b == c); // prints true, because b and c refer to the same object 

Это относится и к все ссылочных типов, в том числе в штучной упаковке примитивов:

Integer a = new Integer(50); 
Integer b = new Integer(50); 
System.out.println(a == b); // prints false, because a and b refer to different objects 

Integer c = b; 
System.out.println(b == c); // prints true, because b and c refer to the same object 

Теперь ссылки не поддерживают < или > или <= или >=:

Thingy a = new Thingy(); 
Thingy b = new Thingy(); 
System.out.println(a < b); // compile error 

однако , вложенные в бокс примитивы могут быть автоматически распакованы, а незапакованные примитивы порт их, так что компилятор использует автоматическая распаковку:

Integer a = new Integer(42); 
Integer a = new Integer(43); 

System.out.println(a < b); 
// is automatically converted to 
System.out.println(a.intValue() < b.intValue()); 

Это авто-распаковка не происходит с == или !=, потому что эти операторы уже действуют без автоматической распаковки - они просто не делать то, что вы ожидать.

2

Поскольку в java операторы == и != всегда выполняют сравнение объектов по ссылке, а типы в штучной упаковке - это объекты.