Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从传入对象&x27;的lambda访问对象;s构造函数_Java_Lambda_Constructor_New Operator - Fatal编程技术网

Java 从传入对象&x27;的lambda访问对象;s构造函数

Java 从传入对象&x27;的lambda访问对象;s构造函数,java,lambda,constructor,new-operator,Java,Lambda,Constructor,New Operator,我有一个Java类MyClass,它具有以下构造函数: public MyClass(Consumer<?> someMethod) 但我得到一个编译器错误,变量myObject可能没有初始化 根据我的研究,我不能切换显示错误的编译器,也不能假装初始化变量,因为它必须是最终的。我该怎么办?这里: final MyClass myObject 声明一个新对象myObject。然后你继续说: = new MyClass(obj -> { doSomethingOuts

我有一个Java类MyClass,它具有以下构造函数:

public MyClass(Consumer<?> someMethod)
但我得到一个编译器错误,变量myObject可能没有初始化

根据我的研究,我不能切换显示错误的编译器,也不能假装初始化变量,因为它必须是最终的。我该怎么办?

这里:

final MyClass myObject
声明一个新对象
myObject
。然后你继续说:

  = new MyClass(obj -> { 
  doSomethingOutsideTheContextOfMyObject();
  myObject.doSmomething(obj);
在自己的声明中使用非常相同的
myObject


那是不可能的!您正在以循环方式创建“自我参考”

我认为传递给构造函数的lambda不应该是消费者;它应该是一个双消费者

诸如此类:

import java.util.function.BiConsumer;

public class MyClass<T> {

    private BiConsumer<MyClass<T>, T> lambda;

    public MyClass(BiConsumer<MyClass<T>, T> lambda) {
        this.lambda = lambda;
    }

    private static void doSomethingOutside() {
        // TODO Auto-generated method stub

    }

    private void doSomething(T obj) {
        // TODO Auto-generated method stub

    }

    public void go(T o) {
        lambda.accept(this, o);
    }

    public static void main(String[] args) {
        MyClass<String> myObj = new MyClass<>((me, obj) -> {
            doSomethingOutside();
            me.doSomething(obj);
        });

        myObj.go("Hello World!");
    }
}
import java.util.function.BiConsumer;
公共类MyClass{
私人双消费者lambda;
公共MyClass(双消费者lambda){
this.lambda=lambda;
}
私有静态void doSomethingOutside(){
//TODO自动生成的方法存根
}
私人无效剂量测定(T obj){
//TODO自动生成的方法存根
}
公开作废go(TO){
lambda.接受(这个,o);
}
公共静态void main(字符串[]args){
MyClass myObj=新的MyClass((me,obj)->{
doSomethingOutside();
me.doSomething(obj);
});
去吧(“你好,世界!”);
}
}

嗯!:) MyClass <代码>添加实现这种lambda的成员方法吗?这个lambda是否会随着构造函数调用的变化而变化,或者实际上是固定的?否则,下面的双消费者解决方案就是正确的选择。我就是这样做的。而且它甚至不像最初看起来那么尴尬。
import java.util.function.BiConsumer;

public class MyClass<T> {

    private BiConsumer<MyClass<T>, T> lambda;

    public MyClass(BiConsumer<MyClass<T>, T> lambda) {
        this.lambda = lambda;
    }

    private static void doSomethingOutside() {
        // TODO Auto-generated method stub

    }

    private void doSomething(T obj) {
        // TODO Auto-generated method stub

    }

    public void go(T o) {
        lambda.accept(this, o);
    }

    public static void main(String[] args) {
        MyClass<String> myObj = new MyClass<>((me, obj) -> {
            doSomethingOutside();
            me.doSomething(obj);
        });

        myObj.go("Hello World!");
    }
}