여기에 많은 답변이 잘 설명되어 있으므로 ::
추가로 ::
연산자가 인스턴스 변수에 사용되는 경우 참조 기능 인터페이스와 정확히 동일한 서명을 가질 필요가 없음 을 분명히하고 싶습니다 . TestObject 유형의 BinaryOperator 가 필요하다고 가정합니다 . 전통적인 방식으로 다음과 같이 구현됩니다.
BinaryOperator<TestObject> binary = new BinaryOperator<TestObject>() {
@Override
public TestObject apply(TestObject t, TestObject u) {
return t;
}
};
익명 구현에서 볼 수 있듯이 두 개의 TestObject 인수가 필요하며 TestObject 객체도 반환합니다. ::
연산자 를 사용하여이 조건을 만족시키기 위해 정적 메소드로 시작할 수 있습니다.
public class TestObject {
public static final TestObject testStatic(TestObject t, TestObject t2){
return t;
}
}
그리고 전화 :
BinaryOperator<TestObject> binary = TestObject::testStatic;
좋아, 잘 컴파일되었습니다. 인스턴스 메소드가 필요한 경우는 어떻습니까? 인스턴스 메소드를 사용하여 TestObject를 업데이트 할 수 있습니다.
public class TestObject {
public final TestObject testInstance(TestObject t, TestObject t2){
return t;
}
public static final TestObject testStatic(TestObject t, TestObject t2){
return t;
}
}
이제 아래와 같이 인스턴스에 액세스 할 수 있습니다 :
TestObject testObject = new TestObject();
BinaryOperator<TestObject> binary = testObject::testInstance;
이 코드는 잘 컴파일되지만 아래 코드는 컴파일되지 않습니다.
BinaryOperator<TestObject> binary = TestObject::testInstance;
내 식은 "TestObject 유형에서 정적이 아닌 메소드 testInstance (TestObject, TestObject)에 대한 정적 참조를 작성할 수 없습니다 ..."라고 말합니다.
인스턴스 메소드는 충분하지만 testInstance
아래와 같이 과부하가 걸리는 경우 :
public class TestObject {
public final TestObject testInstance(TestObject t){
return t;
}
public final TestObject testInstance(TestObject t, TestObject t2){
return t;
}
public static final TestObject testStatic(TestObject t, TestObject t2){
return t;
}
}
그리고 전화 :
BinaryOperator<TestObject> binary = TestObject::testInstance;
코드는 잘 컴파일됩니다. 왜냐하면 testInstance
두 개가 아닌 하나의 매개 변수로 호출하기 때문입니다 . 두 매개 변수는 어떻게 되었습니까? 출력하고 볼 수 있습니다 :
public class TestObject {
public TestObject() {
System.out.println(this.hashCode());
}
public final TestObject testInstance(TestObject t){
System.out.println("Test instance called. this.hashCode:"
+ this.hashCode());
System.out.println("Given parameter hashCode:" + t.hashCode());
return t;
}
public final TestObject testInstance(TestObject t, TestObject t2){
return t;
}
public static final TestObject testStatic(TestObject t, TestObject t2){
return t;
}
}
어느 것이 출력 될까요?
1418481495
303563356
Test instance called. this.hashCode:1418481495
Given parameter hashCode:303563356
따라서 JVM은 param1.testInstance (param2)를 호출 할만큼 똑똑합니다. testInstance
TestObject가 아닌 다른 리소스에서 사용할 수 있습니까?
public class TestUtil {
public final TestObject testInstance(TestObject t){
return t;
}
}
그리고 전화 :
BinaryOperator<TestObject> binary = TestUtil::testInstance;
컴파일되지 않고 컴파일러는 "TestUtil 유형이 testInstance (TestObject, TestObject)를 정의하지 않습니다" 라고 알려줍니다 . 따라서 컴파일러는 동일한 유형이 아닌 경우 정적 참조를 찾습니다. 다형성은 어떻습니까? 최종 수정자를 제거하고 SubTestObject 클래스를 추가하면 :
public class SubTestObject extends TestObject {
public final TestObject testInstance(TestObject t){
return t;
}
}
그리고 전화 :
BinaryOperator<TestObject> binary = SubTestObject::testInstance;
또한 컴파일되지 않으며 컴파일러는 여전히 정적 참조를 찾습니다. 그러나 아래 코드는 is-a 테스트를 통과하므로 제대로 컴파일됩니다.
public class TestObject {
public SubTestObject testInstance(Object t){
return (SubTestObject) t;
}
}
BinaryOperator<TestObject> binary = TestObject::testInstance;
* 나는 단지 공부하고 있으므로 시도하고보고 알아 냈습니다. 잘못되면 나를 바로 고쳐주세요.