Возможно ли автообновление для классов, которые я создаю?
Можно ли использовать автобоксинг для создаваемых мной классов? Например, у меня есть этот подкласс Number
.
public class UnsignedInteger extends Number {
int n;
public UnsignedInteger(int n) {
if(n >= 0)
this.n = n;
else
throw new IllegalArgumentException("Only positive integers are supported");
}
}
Теперь UnsignedInteger i = new UnsignedInteger(88);
работает отлично, но есть ли способ сделать этот компилятор: UnsignedInteger i = 88;
? Это не для меня. Спасибо заранее!
Ответы
Ответ 1
Короче говоря, нет. Нет способа получить это для компиляции.
Java определяет только ограниченный набор предопределенных преобразований бокса.
Из JLS, раздел 5.1.7:
Конверсия бокса преобразует выражения примитивного типа в соответствующие выражения ссылочного типа. В частности, следующие девять преобразований называются конверсиями бокса:
-
От типа boolean до типа Boolean
-
От байт типа к типу Byte
-
От типа short до типа Short
-
Из типа char введите символ
-
Из типа int для ввода Integer
-
От типа long до типа Long
-
От типа float до типа Float
-
От типа double до типа Double
-
От нулевого типа до нулевого типа
Кроме того, можно подумать о перегрузке оператора =
для выполнения этого преобразования, но перегрузка операторов не поддерживается в Java, в отличие от С++, где это было бы возможно.
Итак, ваше преобразование невозможно в Java.
Ответ 2
Нет, к сожалению. Автоматические преобразования бокса (согласно JLS §5.1.7) определены только для стандартных классов примитивных оболочек.
Ответ 3
Короче: Нет, это невозможно. Для этого вам потребуется перегрузка оператора, которая недоступна на Java. Смотрите ссылку .
Ответ 4
Если вы используете Groovy, вы можете установить логическое поведение, выполнив метод asBoolean: http://groovy-lang.org/semantics.html#_customizing_the_truth_with_asboolean_methods
Пример:
class Color {
String name
boolean asBoolean(){
name == 'green' ? true : false
}
}
assert new Color(name: 'green')
assert !new Color(name: 'red')
Я знаю, что это не простая Java, но компилируется в байт-код и работает на JVM.