重复覆盖功能界面的抽象方法?

时间:2014-11-05 15:25:32

标签: java-8 functional-interface

我在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是最后的偶数,你怎么用类重写呢?

1 个答案:

答案 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时,您将丢失对第一个实例的引用。