在以下代码中:
interface Callback {
void greet(String greeting);
}
private static <T extends Callback & Serializable> void greetMe(T callback) {
callback.greet("Hello world!");
}
public static void main(String[] args) {
greetMe(greeting -> System.out.println(greeting));
}
由于lambda不可序列化,以下代码行无法编译:
greetMe(greeting -> System.out.println(greeting));
我的问题是,让lambda实现可序列化有什么语法上的好处吗,还是我必须让它成为一个非匿名类?
从JLS 15.16。演员表:
强制转换可用于显式“标记”具有特定目标类型的lambda表达式或方法引用表达式。为了提供适当程度的灵活性,目标类型可以是表示交叉口类型的类型列表,前提是交叉口诱导功能接口(§9.8)。
您可以直接将其强制转换为可序列化的:
greetMe((Callback & Serializable) greeting -> System.out.println(greeting));
我目前正在研究Typescript中的重载。 假设我有一个重载的函数: 要么调用函数时没有参数,要么调用函数时有两个参数(foo和bar)。根据vscode的智能感知,结果变量具有布尔|未定义的类型。 为什么即使我已经测试了参数,仍然可以?如果存在,那么类型推断不应该预测也存在吗?
如果我有两个具有相同签名的方法,仅根据vararg类型变化,Java如何知道在我不使用参数或传递null时调用哪个方法? 例如,如果我有以下两种方法: 我打电话给: 输出是“字符串args”。为什么Java决定在这里调用第二个方法而不是第一个方法?我很难找到描述这一点的规范的相关部分。
编译以下Java代码: 此外,编译以下代码: 以下代码将给我一个编译错误: 因此,看起来,如果其中一个边界类型本身是类型参数,就不可能有多个边界。但为什么呢? 据我所知,如果声明了多个边界,那么最多一个边界可能是一个类(其他所有边界都是接口),并且它必须是第一个边界。 但是,既然在我的示例中是一个接口,为什么编译器会抱怨呢?毕竟,T是接口还是类应该没有任何区别。 我试图在网上找到答案,但显然我的谷
在了解Java泛型的过程中,我遇到了以下问题: 假设我有下面的方法来添加列表的元素,只限于包含数字的列表。 但是这段代码和这段代码有什么不同: 它们都按预期编译和执行。这两者之间有什么区别?除了语法之外?什么时候我更喜欢使用通配符而不是前者? 是的,使用通配符方法,我不能在列表中添加除null之外的新元素,否则它将无法编译。除此之外呢?
问题内容: Java中是否像C ++中一样有变量类型? 一个例子: 我知道Java中有一个增强的for循环,但是有自动吗?如果不是,是否有这样做的技巧?我指的是C ++ 11中的新功能 问题答案: 在问题被 编辑 之前回答: 不,Java中没有变量类型。可以通过以下方式实现相同的循环: Java具有局部变量,其范围在定义它们的块内。 _与C和C 类似,但是没有auto或register关键字。 但
我的错误:(上面的行)绑定不匹配:MyUtil类型的泛型方法bubbleSort(List,List)不适用于参数(ArrayList,ArrayList)。推断的类型Country不是有界参数>}的有效替代品