【发布时间】:2015-08-18 21:41:09
【问题描述】:
我在我们的项目中遇到了以下代码:
MyInterface var = MyClass::new;
有什么区别
MyInterface var = new MyClass();
懒惰?
【问题讨论】:
-
他们没有任何共同点。
标签: java constructor java-8 variable-assignment method-reference
我在我们的项目中遇到了以下代码:
MyInterface var = MyClass::new;
有什么区别
MyInterface var = new MyClass();
懒惰?
【问题讨论】:
标签: java constructor java-8 variable-assignment method-reference
MyInterface var = new MyClass();
创建MyClass 的实例并将其分配给MyInterface 类型的变量。这需要 MyClass implements MyInterface 并具有无参数构造函数。结果是MyClass 的一个实例,它实现了MyInterface,但是它喜欢。
MyInterface var = MyClass::new;
尝试实现MyInterface ad-hoc。这要求MyInterface 是一个具有单一抽象方法的功能接口。该单一抽象方法必须具有可从MyClass 分配的返回类型和匹配MyClass 构造函数之一的参数列表。
类似于:
MyInterface var = new MyInterface() {
public MyClass anyMethodName() {
return new MyClass();
}
}
结果是MyInterface 的一个实例,它将在调用其单个抽象方法时创建一个新的MyClass 实例,将其所有参数传递给MyClass 的构造函数。
换句话说,这两个结构没有任何共同点。
【讨论】:
MyClass 实现MyInterface 或MyInterface 和MyClass 之间有任何关系。它与Supplier<MyClass> s=MyClass::new; 没有什么不同。如前所述,if MyClass 实现 MyInterface 它可以按照自己的意愿进行操作,并且通过让 MyClass 构造其他 MyClass 实例来实现它是非常罕见的。关键是,仅仅因为您可以使用这两个语句之外的几种特殊安排使其等价,并不会使这两个结构本身等价。
foo() 和 bar() 是不同的方法一样虽然你可以让他们做同样的事情,但他们仍然不同。
MyInterface var = new MyInterface(){ public MyClass anyMethodName(){ return new MyClass(); } } 也不等同于MyInterface var = new MyClass();