【问题标题】:Java 6: Constructor argument, null and the ternary operatorJava 6:构造函数参数、null 和三元运算符
【发布时间】:2013-12-02 03:15:18
【问题描述】:

只是为了好奇……

假设我有一个有两个构造函数的类:

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

我想通过以下语句创建一个新类:

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

这可以接受吗? null 会用空/默认构造函数实例化类吗?如果没有,有没有办法用三元运算符来完成这个?

请注意,我使用的是 Java 版本 6。

【问题讨论】:

  • 你是在问mew Class()是否和新的Class(null)一样?
  • Class 是哪个包?
  • 嗯,我不这么认为。我认为答案是 () 与 null 不同,并且我的示例中的 null 实际上会调用 Class(int) 构造函数。对吧……?
  • 您的代码将被视为constructor with parameter 调用。
  • 您似乎回答了自己的问题。

标签: java null ternary-operator java-6


【解决方案1】:
new Class( ( true ) ? 100 : null);

你不会有一个空的构造函数的原因是,我们会得到的唯一选择是new Class(100)new Class(null)

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

现在 1 和 2 不同

null 被理解为Object,而构造函数期望int。如果我们有

 public Class(Integer x){} 

那么 new Class(null) 将被允许,因为 Object 是 Integer 的超类。因此,唯一的选择是

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

【讨论】:

  • 谢谢,这真的让我记忆犹新!但是...最后一行(几乎是实际问题的答案)类似于彼得的答案(首先发布)
  • 正如我所说,这是唯一的答案:)
  • 是的,我只是想发表我选择 Peter 的答案作为该问题的“已接受”答案的动机,但我真的很欣赏这篇文章,因为我刷新了关于 Integer/int 的记忆,(void ) 等等!
  • BTW (void) 在 Java 中无效。
【解决方案2】:

你可以使用可变参数

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

然后使用new Class();new Class(2);

【讨论】:

  • class Class1{ void doSomething(){ new Class1();新的第 1(2) 类; } Class1(int...x){} }
  • 尝试编译您的代码。 int... x; 等效于 int[] x; 假设带有参数的构造函数实际上使用这个参数。
  • 您总是可以在构造函数中检查 if(x!=null && x.length == 1) 并且是的 - 我确实编译了我的代码,是吗?此外,OP 想要知道如何使用 new Class( ( true ) ? 100 : null);使用单个构造函数并使用 var args 解决了目的
  • 是的,我做了并且得到了编译错误。无论如何,我不相信 OP 想要 array 作为构造函数参数。
  • @PM77-1 - 来自 doc - 最后一个参数类型后面的三个句点表示最后一个参数可以作为数组或参数序列传递。因此,尽管数据结构是数组,但您也可以使用它来传递一个参数,这也是这里所需要的
【解决方案3】:

你可以这样做

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

根据定义,? : 的类型与最后一个参数相同。即对象,你不能让它的类型更少,价值更少。

【讨论】:

  • 这是我目前实际得到的,所以如果不使用“Class c1 = ...”分配它就没有办法做到这一点? :(
  • 如果您不需要保留对象,我会避免首先创建它。
猜你喜欢
  • 2020-10-31
  • 2015-09-29
  • 2012-04-16
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多