- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有时我会看到在方法调用中使用菱形运算符的示例。
一个语法示例是:
.<ClassName>methodName()
我不确定我是否完全理解在何种情况下有这种用途的情况。在引用文献中没有找到对此的解释。
你可以解释一下那个案例或建议我可以找到解释的信息来源吗?
我在下面提供了一个工作示例。此示例使用 RxJava2。那里Flowable.<Integer>create(emitter -> emit(emitter), BackpressureStrategy.BUFFER)
没有 <Integer>
就无法编译因为方法 emit 接受 FlowableEmitter<Integer> emitter
.
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();
}
最佳答案
ClassName.<Type>methodName(...)
是Java中方法调用的一种形式。 JLS 中列出了许多其他形式:
MethodInvocation:
MethodName ( [ArgumentList] )
TypeName . [TypeArguments] Identifier ( [ArgumentList] ) <--- this is the form in question
ExpressionName . [TypeArguments] Identifier ( [ArgumentList] )
Primary . [TypeArguments] Identifier ( [ArgumentList] )
super . [TypeArguments] Identifier ( [ArgumentList] )
TypeName . super . [TypeArguments] Identifier ( [ArgumentList] )
TypeArguments:
< TypeArgumentList >
TypeArgumentList:
TypeArgument {, TypeArgument}
在<...>
里面,您应该显式地为泛型方法的每个类型参数编写类型参数。
请注意 ClassName<Type>.methodName
不是其中一种形式。
您在尝试用纯 Java 模拟此行为时遗漏的主要内容是 GenericInterface.doJob
应该带一个参数,因为你传入的lambda有一个参数:
param -> processParam(param)
^^^^^
此参数的类型应为 GenericClass<T>
,因为那是processParam
需要。
interface GenericInterface <T> {
void doJob(GenericClass<T> param);
}
这类似于 subscribe
FlowableOnSubscribe<T>
中的方法,这就是Flowable.create
作为参数。
请注意 subscribe
采用与 Flowable.create
不同的类型返回,但我们采用与 GenericClass.genericMethod
相同的类型返回。这仍然模拟了“显式编写类型参数编译但省略它会产生错误”的相同行为,因此我不会费心创建新类型。
现在您得到与 Flowable.create
相同的行为RxJava 中的方法:
GenericClass.genericMethod(param -> processParam(param)); // error
GenericClass.<Integer>genericMethod(param -> processParam(param)); // OK
这是因为Java的类型推断算法不够强大,无法在第一种情况下正确推断类型。
虽然这和 RxJava 之间仍然存在差异 - Flowable.create
需要 FlowableOnSubscribe<T>
, 它有一个``
关于java - 何时以 .<ClassName>methodName() 的形式在 Java 中使用带有方法调用的菱形运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72689148/
我的意思是: body.class1 div.class1 { color: blue; } div.class1.class2 { color: red; } Hello
编译的时候一直报这个错,不知道为什么。我看过this发布和this一个,但它们似乎是不同的问题。 相关代码结构为: // main.cpp #include "MyClass.h" int main(
这个问题已经有答案了: What is a raw type and why shouldn't we use it? (16 个回答) 已关闭 9 年前。 标题非常不言自明。请问原始类型,例如Arr
我想知道在哪里记录了这种形式的构造函数调用。这种语法显然适用于 Visual Studio 6.0 版(我知道它不能使用 G++ 编译)。 请注意,我不是在寻找替代品,也不需要知道它是好是坏。 cla
这是一个菜鸟问题,抱歉,我来自 Java,不知道为什么我的 OO 东西不起作用。我有这个主要的: #include #include "Foo.h" //changed name using nam
我正在使用 Code::Blocks 构建我的项目,其中包含三个文件:main.cpp、TimeSeries.cpp、TimeSeries.h。 TimeSeries.h 为 TimeSeries 类
我想... 扫描文档以查找具有特定类名的所有元素 对该元素的 innerHTML 执行一些关键功能 更改该元素的类名,这样如果我稍后进行另一次扫描,我就不会重做该元素 我认为这段代码可以工作,但出于某
我有一些 JQuery 代码,可将特定类的所有 HTML 元素转换为文本区域元素。 我的问题:我使用 JQuery(.addClass()) 将元素类从“可更新”更改为“可更新 P”。但是当我去搜索所
为什么按属性选择类 [class="classname"] 代替按类选择 .classname ?在考虑跨电子邮件客户端兼容的电子邮件时,这样做有什么好处吗? 编辑:我完全了解每个选择器是如何工作的,
所以基本上我使用 MyLocationOverlay 在 map 上绘制用户位置。然而,我不喜欢它的绘制方式。我想要拥有自己的图标并删除该位置周围的圆圈。 我知道如何执行此操作的唯一方法是创建一个扩展
根据另一个类中给定的输入,此类必须从要在其中找到该变量的 4 个类之一检索变量。例如。如果输入是 s,则此类要查找的变量可在 Sumup.counter 中找到,而当输入是 a 时,它需要的变量可以在
从命令行运行基本的 java 程序需要 3 个步骤: 编写代码: 公共(public)类HelloWorld {公共(public)静态无效主(字符串[] args){ System.out.prin
例如 - 我只有下一行代码,如果 span 包含从 outcome 开始的某些 class ,我需要重新识别--事件。如果是这样 - 通过 JS 删除它。 我们有什么想法可以实现它吗? 我接下来尝试
我正在学习 Java,所以请多多包涵,即使这对您来说很简单。 我正在使用两个链表: private LinkedList x; private LinkedList y; public List()
相关:Jquery timeout for doubleclick 鉴于此代码: function handleClick() { var div = $(this); var origina
#ifndef RESERVATIONS_H_INCLUDED #define RESERVATIONS_H_INCLUDED #include #include class Reservatio
我在我正在处理的代码库中看到一些代码如下: ZfooName::ZfooName(int magoo) : ZfooName() { fGoo = magoo; } 我假设这是一
我要找 IReadOnlyCollection 使用 WebDriverWait 确保元素已在页面上呈现。 这是我的代码 WebDriverWait wait = new WebDriverWait
我有这两种方法来编写构造函数。 className()和 className._() 它们之间有什么区别,我什么时候应该使用哪个? class GlobalState{ final Ma
下面的方法 公共(public) JSound() { } 从来没有人要求提供此代码?有什么原因吗? 如果我不能让它以这种方式工作,还有第二种方法可以使用鼠标监听器吗?它需要一个非静态方法,所以我不确
我是一名优秀的程序员,十分优秀!