Какая разница между этим::myMethod и ClassName::myMethod?
Я не понимаю разницу между
this::myMethod
а также
ClassName::myMethod
когда это экземпляр класса ClassName.
Я думал, что в обоих случаях я вызываю метод myMethod
и дать myObject
что я бегу в качестве аргумента myMethod
метод, но я думаю, что есть разница. Что это?
1 ответ
Решение
this::myMethod
относится к myMethod
на конкретном случае ClassName
- экземпляр, который вы положили this::myMethod
в своем коде.
ClassName::myMethod
может ссылаться на статический метод или метод экземпляра. Если он ссылается на метод экземпляра, он может быть выполнен на другом экземпляре ClassName
каждый раз это называется.
Например:
List<ClassName> list = ...
list.stream().map(ClassName::myMethod)...
выполнит myMethod
каждый раз для другого ClassName
член списка.
Вот подробный пример режима, который показывает разницу между этими двумя типами ссылок на методы:
public class Test ()
{
String myMethod () {
return hashCode() + " ";
}
String myMethod (Test other) {
return hashCode() + " ";
}
public void test () {
List<Test> list = new ArrayList<>();
list.add (new Test());
list.add (new Test());
System.out.println (this.hashCode ());
// this will execute myMethod () on each member of the Stream
list.stream ().map (Test::myMethod).forEach (System.out::print);
System.out.println (" ");
// this will execute myMethod (Test other) on the same instance (this) of the class
// note that I had to overload myMethod, since `map` must apply myMethod
// to each element of the Stream, and since this::myMethod means it
// will always be executed on the same instance of Test, we must pass
// the element of the Stream as an argument
list.stream ().map (this::myMethod).forEach (System.out::print);
}
public static void main (java.lang.String[] args) {
new Test ().test ();
}
}
Выход:
2003749087 // the hash code of the Test instance on which we called test()
1747585824 1023892928 // the hash codes of the members of the List
2003749087 2003749087 // the hash code of the Test instance on which we called test()