익명 개체를 만들고 어딘가에 저장하는 메서드가 있다고 가정 해 봅니다. 이 익명 객체는 매개 변수로 전달 된 메서드에서 람다를 호출합니다.매개 변수로 전달 된 람다에서 익명 클래스의 다른 메서드에 액세스
public class myCallBackManager {
private List<MyCallBack<?>> callBackList = new LinkedList<MyCallBack<?>>();
public <T> void addCallBack(Consumer<MyCallBack<T> onCall, Runnable something){
callBackList.add(new MyCallback<T>() {
@Override
protected void call(MyCallback<T> callback) {
onCall.accept(callback);
}
@Override
protected void doSomething() {
something.run());
}
}
}
public void runAll() {
for (MyCallback<?> myCallback : callBackList) {
myCallback.call();
}
}
}
이 개체는 내부적으로 개체를 저장하고 나중에 모두 실행되도록 요청합니다.
하지만,이를 추가 할 :
public static void main(String[] args) {
Runnable someRunnable =() -> System.out.println("Doing something");
MyCallBackManager myCallBackManager = new MyCallbackManager();
myCallBackManager.<SomeObject> addCallback(
(callback) -> {
doSomething(); // WON'T WORK
System.out.println(callback.toString());
},
someRunnable
};
myCallBackManager.runAll();
}
을 여기에, 나는) 해봐요을 (전화 애 쓰고 onCall 람다에서이 익명 함수의 호출()에 의해 실행되는 것처럼 그대로 라는. 문제는, 내가 존재하지 않는 객체에 핸들이 없기 때문에,이 메소드가 호출 될 수 없다는 것입니다. 람다에서 doSomething()을 호출하는 방법이 있습니까?
doSomething() 메서드에 액세스하려고 시도하는 대신 someRunnable.run()을 호출하는 것과 같은 특별한 경우에 대한 해결 방법이 있지만이 메서드를 대신 호출하는 방법을 특히 요구하고 있습니다.
당신은 당신의 코드에서 몇 가지 이상한 일들이'MyCallback'와'MyCallBack','MyCallBack' 원시 형,'MyCallBackManager myCallBackManager = 새로운 MyCallbackManager로서'-하는 유효하지 않습니다. 이게 진짜 코드인가요? –
@ MCEmperor 아니요, 제 실제 코드에는 더 많은 것들이 있습니다. 나는 관련성이 높은 것들을 유지하려고 노력했습니다. 제네릭을 사용하고 있으므로 원시 타입이 없습니다. 나는 그것을 편집 할 것이다. 또한 인스턴스화를위한 oops, 좋은 잡기. – Eth
이에 따라 질문을 편집해야합니다. 예를 들어, 당신이'MyCallback' 클래스의 소스를 제공하지 않았기 때문에, 당신이 원하는 것이 명확하지 않습니다. 나는 어떻게 든 당신이 비교적 간단한 작업을 위해 복잡한 것을 가지고 있다는 느낌을 받았습니다. –