当前位置: 首页 > 知识库问答 >
问题:

何时将diamond运算符与Java中的方法调用一起使用,形式为methodName()?

缑文栋
2023-03-14

有时我会看到在方法调用中使用菱形操作符的示例。

语法示例如下:

.<ClassName>methodName()

我不确定我是否完全理解在何种情况下有这种使用的理由。在参考资料中找不到对此的解释。

请你解释一下这个案例,或者提供一个我可以找到解释的信息来源?

我在下面提供了一个工作示例。此示例使用RxJava2。有Flowable。


import io.reactivex.BackpressureStrategy;
import io.reactivex.Flowable;
import io.reactivex.FlowableEmitter;
import io.reactivex.schedulers.Schedulers;

public class Sample {

    public static void main(String[] args) {
        Flowable.<Integer>create(emitter -> emit(emitter), BackpressureStrategy.BUFFER)
                .observeOn(Schedulers.computation(), true,2)
                .map(data -> data * 1)
                .subscribe(Sample::process,
                        err -> System.out.println("ERROR: " + err),
                        () -> System.out.println("DONE"));

    }

    public static void process(int value) {
        System.out.println(value);
        sleep(1000);
    }

    private static void emit(FlowableEmitter<Integer> emitter) {
        int count = 0;

        while(count < 10) {
            count++;

            System.out.println("Emitting ..." + count);
            emitter.onNext(count);
            sleep(500);
        }
    }

    private static boolean sleep(int ms) {
        try {
            Thread.sleep(ms);
            return true;
        } catch (InterruptedException e) {
            return false;
        }
    }


}

当我尝试用普通Java模拟类似的情况时,它不起作用。我理解错了什么?


public class Sample2 {

    public static void main(String[] args) {
        GenericClass.<Integer>genericMethod(param -> processParam(param));

    }

    private static void processParam(GenericClass<Integer> b) {
        }
    }

}

class GenericClass <T> {
    public static <T> GenericClass<T> genericMethod(GenericInterface<T> genericinterface) {
        return new GenericClass<T>();
    }
}

interface GenericInterface <T> {
    T doJob();
}


共有1个答案

云卓
2023-03-14

您可以将示例扩展为:

class Sample2 {

    public static void main(String[] args) {
        GenericClass.genericMethod(new GenericInterface<Integer>() {

            @Override
            public Integer doJob(? param) {
                return param;
            }
        }));

    }

    private static void processParam(GenericClass<Integer> b) {
    }
}

}

class GenericClass <T> {
    public static <T> GenericClass<T> genericMethod(GenericInterface<T> genericinterface) {
        return new GenericClass<T>();
    }
}

interface GenericInterface <T> {
    T doJob();
}

正如您所看到的,lambda表达式需要一些输入参数“?param”,它与GenericInterface#doJob的签名不匹配。如果将代码更改为:

lass Sample2 {

    public static void main(String[] args) {
        GenericClass.genericMethod(param -> processParam(param)); // <- this compiles now without any "<..>"

    }

    private static void processParam(GenericClass<Integer> b) {
    }
}

}

class GenericClass <T> {
    public static <T> GenericClass<T> genericMethod(GenericInterface<T> genericinterface) {
        return new GenericClass<T>();
    }
}

interface GenericInterface <T> {
    T doJob(T param);
}

当您在处理LAMDA和函数接口时,请尝试将它们扩展到匿名的内部类对应项。这可以帮助您的IDE恢复良好的状态,并使这样的错误更加明显。

 类似资料:
  • 问题内容: 考虑下面的Java代码,它尝试实例化一些: 并且很简单;在Java 7中使用新的Diamond运算符来减少不必要的类型参数重复。 是使用匿名类的一种变体,可能会覆盖的某些方法。 尝试使用菱形运算符,类似于,但这是编译错误,消息 “ <>”不能与匿名类一起使用。 产生一个错误,证明编译器知道实际需要的类型。错误消息是 类型不匹配:无法从新的ArrayList (){}转换为List 因此

  • 问题内容: 在Java 1.7.0_55中,如果我编写此字段声明,则会收到编译错误(“不兼容的类型”): 如果我将其改为: 它编译良好。(我在这里以syncedMap为例,但其他Collections方法,不可修改,同步等也是如此) 但是,为什么钻石操作员不能像我在这里期望的那样工作?由于Collections.synchronizedMap()声明为: 在我看来,构造函数调用的类型参数必须与字段

  • 我试图了解java中的运算符,如链接:-instanceof 但当我尝试运行以下代码时:- } 我在编译时遇到以下错误: 下面是放置src代码的目录结构:- 注意:我从

  • 问题内容: 从Java 7开始,钻石语法在方法参数中并不总是有效,例如,为什么钻石运算符不适用于Java7中的java.util.Collections方法?。该问题的答案提到Java 8中的目标类型推断可解决该问题。 是否还有其他情况无法使用菱形语法? 问题答案: Diamond运算符不能总是在Java 8中使用。最初的改善Java 8推理的计划(JEP 101 )有两个目标: 在方法上下文中添

  • 问题内容: 将导致编译器警告。 但是,以下示例在编译时没有任何警告: 我很好奇为什么根本需要引进钻石操作员。如果不存在类型参数,为什么不对构造函数进行类型推断(因为它已经在Java中的静态方法中完成,并被Google guava等集合库所利用) 编辑 :使用millimoose答案作为起点,我了解了实际上是什么类型的擦除,而不仅仅是删除所有类型的信息。编译器实际上做了更多(从官方文档复制): 如果

  • 我试图在EventEmitter上使用一些简单的操作符(来自FormModel.valueChanges),但我不知道应该如何实现。 EventEmitter类从Subject扩展而来