Discuss / Java / 方法引用,引用一个非静态方法时,应该加一个new关键字吧

方法引用,引用一个非静态方法时,应该加一个new关键字吧

Topic source

shadowTy

#1 Created at ... [Delete] [Delete and Lock User]
Arrays.sort(array, String::compareTo);

是否应该改为

Arrays.sort(array, new String()::compareTo);

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

你真的运行过代码吗?

shadowTy

#3 Created at ... [Delete] [Delete and Lock User]

String确实不行....但是Main这个类的compareTo这个方法如果不是static的话,引用时就得new Main()::compareTo,如下所示

public class Main {
	public int compareTo(String s1, String s2) {
		return s1.toLowerCase().compareTo(s2.toLowerCase());
	}

	public static void main(String[] args) {
		String[] array = new String[] { "apple", "Orange", "banana", "Lemon" };
		// 请使用忽略大小写排序,并改写为方法引用:
		Arrays.sort(array, new Main()::compareTo);
		System.out.println(String.join(", ", array));
	}
}

shadowTy

#4 Created at ... [Delete] [Delete and Lock User]

是因为String的方法第一个参数是this所以不用new了吗?

IM卓荣

#5 Created at ... [Delete] [Delete and Lock User]

 是不是应该自己先运行一下呢?

老师不是说的很清楚,是隐含传入this的

shadowTy

#6 Created at ... [Delete] [Delete and Lock User]

我当然运行了...你看我上面贴的Main那个类了吗?

IM卓荣

#7 Created at ... [Delete] [Delete and Lock User]

哦,你的是什么版本的java?, 我1.8不用加new运行是没问题的。

IM卓荣

#8 Created at ... [Delete] [Delete and Lock User]

而且重新new一个string实例逻辑就不对, 里面的属性value变了,compareTo方法是要用到实例自身的value的,重新new一个,value变了,肯定不对。  至于你说的Main方法要用到static,这个和你说的问题不是一回事吧

shadowTy

#9 Created at ... [Delete] [Delete and Lock User]

我明白了,直接引用this了。Main那个方法有俩参数,和String这个方法不一样,但是引用static方法和引用实例方法还是有区别的。

如果你要传入比较两个对象,就不应该是CompareTo而应该是静态方法Compare(Object o1, Object o2);

如果你定义的是实例方法Compare(Object o),那么它有隐含参数this。另外如果把你上面那个改称实例方法Compare(Object o),也无法传入Main::Compare,因为this所指向的实例是Main类,而Comparator<String>里的compareTo需要的参数是String类。


  • 1
  • 2

Reply