有时我会看到在方法调用中使用菱形操作符的示例。
语法示例如下:
.<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();
}
您可以将示例扩展为:
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扩展而来