2013-11-18 5 views
0

Просто для любопытства ...Java 6: Конструктор аргумент, утратившим тройной оператор

Предположим, у меня есть класс с двумя конструкторами:

public Class(){} 
public Class(int x){} 

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

new Class((true) ? 100 : null); 

Это приемлемо? Будет ли null создавать экземпляр класса с пустым/стандартным конструктором? Если нет, есть ли способ сделать это с помощью тернарного оператора?

Обратите внимание, что я на Java версии 6.

+1

Время обновления. –

+0

Ухм ... Разработайте! – optional

+0

Вы спрашиваете, является ли 'mew Class()' таким же, как новый 'Class (null)'? –

ответ

6

Вы можете сделать это

Class cl = flag ? new Class(100) : new Class(); 

По определению, тип ? : такой же, как последний аргумент. то есть объект, вы не можете сделать его меньше и меньше.

+0

Это то, что я на самом деле получил на самом деле, поэтому нет способа сделать это, не присваивая ему «Class c1 = ...»? :( – optional

+0

Если вам не нужно держать объект, я бы не стал его создавать в первую очередь. –

2
new Class((true) ? 100 : null); 

причина, по которой вы не будете иметь пустой конструктор, потому что, только выбор, который мы получили бы бы new Class(100) и new Class(null)

1. new Class(null) 
2. new Class() 

Сейчас 1 не совпадает с 2

нуль осмысливается как Object, где, когда конструктор ожидает int. Если бы мы имели

public Class(Integer x){} 

new Class(null) тогда был бы недопустим, поскольку объект является супер класс для целых чисел. Таким образом, единственной альтернативой является

boolean check = true; 
check ? new Class(100) : new Class(); 
+0

Спасибо, это действительно сильно освежило мою память! Однако ... последняя строка (в значительной степени ответ на фактический вопрос) аналогичен ответу Питера (который был опубликован первым) – optional

+0

Как я уже сказал, это единственный ответ :) –

+0

Yup, я просто хотел опубликовать мотивы для ответа Питера как на «принятый» ответ на вопрос, но я действительно оценил сообщение, хотя, поскольку я обновил свою память о Integer/int, (void) и так далее! – optional

0

Вы можете использовать переменные аргументы

Class(int... x){} //constructor 

, а затем использовать new Class(); или new Class(2);

+0

Вы протестировали его? –

+0

класс Class1 { \t \t \t \t недействительный йоЗотеЬЫпд() { \t \t \t нового Class1(); \t \t \t новый Class1 (2); \t \t} \t \t \t Class1 (интермедиат ... х) {}} \t – user1339772

+0

Попробуйте ** компилировать ** код. 'int ... x;' эквивалентно 'int [] x;' если предположить, что конструктор с параметром фактически ** использует ** этот параметр. –

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