我在Java 8中有一个功能界面:
public interface IFuncLambda1 {
public int someInt();
}
在main中:
IFuncLambda1 iFuncL1 = () -> 5;
System.out.println("\niFuncL1.someInt: " + iFuncL1.someInt());
iFuncL1 = () -> 1;
System.out.println("iFuncL1.someInt: " + iFuncL1.someInt());
运行它将产生:
iFuncL1.someInt: 5
iFuncL1.someInt: 1
此功能是否正常?这是打算吗?
如果覆盖将在实现类中完成,并且实现将在某个时刻发生变化,那么在调用该方法的每个地方,行为都是相同的,我们将具有一致性。但是,如果我通过示例中的lambda表达式更改行为/实现,则行为将仅在下一次更改时有效,稍后将在流程中进行。这感觉不可靠,难以理解。
编辑: @assylias我不知道someInt()的行为是如何改变的...... 如果我向someInt添加了一个参数并拥有以下代码该怎么办:
IFuncLambda1 iFuncL1 = (x) -> x - 1;
System.out.println("\niFuncL1.someInt: " + iFuncL1.someInt(var));
iFuncL1 = (x) -> x + 1;
System.out.println("iFuncL1.someInt: " + iFuncL1.someInt(var));
var是最后的偶数,你怎么用类重写呢?
答案 0 :(得分:4)
在您的示例中,() -> 5
是一个对象,() -> 1
是另一个对象。您碰巧使用相同的变量来引用它们,但这只是引用在Java中的工作方式。
顺便说一句,它的行为方式与使用匿名类的方式完全相同:
IFuncLambda1 iFuncL1 = new IFuncLambda1() { public int someInt() { return 5; } };
System.out.println("\niFuncL1.someInt: " + iFuncL1.someInt());
iFuncL1 = new IFuncLambda1() { public int someInt() { return 1; } };
System.out.println("iFuncL1.someInt: " + iFuncL1.someInt());
或使用“普通”类:
public static class A implements IFuncLambda1 {
private final int i;
public A(int i) { this.i = i; }
public int someInt() { return i; }
}
IFuncLambda1 iFuncL1 = new A(5);
System.out.println("\niFuncL1.someInt: " + iFuncL1.someInt());
iFuncL1 = new A(1);
System.out.println("iFuncL1.someInt: " + iFuncL1.someInt());
又有A
的两个实例,但是当您重新分配iFuncL1
时,您将丢失对第一个实例的引用。