接口中的默认方法,但只有静态最终字段
default methods in interface but only static final fields
我知道界面中的所有 字段 都是隐含的 static and final。这在 Java 8.
之前是有道理的
但是随着 默认方法 的引入,接口也具有抽象 class 的所有功能。因此,非静态和非最终字段也是必需的。
但是当我尝试正常声明一个字段时,默认情况下它变成了 static 和 final。
有没有办法在Java 8.
的接口中声明一个非静态和非final字段
还是我完全误解了什么???
否 - 在 Java 8 中,所有字段都是静态的和最终的,与以前的 Java 版本一样。
在接口中包含状态(字段)会引发问题,特别是与 the diamond problem.
有关的问题
另请参阅 this entry,其中阐明了行为继承和状态继承之间的区别。
Java中接口的所有字段都是public static final
.
即使添加了默认方法,在接口中引入可变字段仍然没有任何意义。
由于接口演化的原因添加了默认方法。您可以向接口添加新的默认方法,但只有在实现中使用已经定义的方法时才有意义接口:
public interface DefaultMethods {
public int getValue();
public default int getValueIncremented() {
if (UtilityMethod.helper()) { // never executed, just to demonstrate possibilities
"string".charAt(0); // does nothing, just to show you can call instance methods
return 0;
}
return 1 + getValue();
}
public static class UtilityMethod {
public static boolean helper() {
return false;
}
}
}
否 - 在 java 8 中,您不能在接口中没有 public static final 字段,不幸的是。
但我希望将来这会被添加到语言中。
Scala 允许与非静态字段进行接口,这为代码重用和组合开辟了比 Java 8
中更多的可能性
我强烈不建议这样做。请改用抽象 classes。但是如果你真的需要它,你可以用一些包装器 class 做一些变通技巧。这是一个例子:
public interface TestInterface {
StringBuilder best = new StringBuilder();
default void test() {
best.append("ok");
System.out.print(best.toString());
}
}
我知道界面中的所有 字段 都是隐含的 static and final。这在 Java 8.
之前是有道理的但是随着 默认方法 的引入,接口也具有抽象 class 的所有功能。因此,非静态和非最终字段也是必需的。
但是当我尝试正常声明一个字段时,默认情况下它变成了 static 和 final。
有没有办法在Java 8.
的接口中声明一个非静态和非final字段还是我完全误解了什么???
否 - 在 Java 8 中,所有字段都是静态的和最终的,与以前的 Java 版本一样。
在接口中包含状态(字段)会引发问题,特别是与 the diamond problem.
有关的问题另请参阅 this entry,其中阐明了行为继承和状态继承之间的区别。
Java中接口的所有字段都是public static final
.
即使添加了默认方法,在接口中引入可变字段仍然没有任何意义。
由于接口演化的原因添加了默认方法。您可以向接口添加新的默认方法,但只有在实现中使用已经定义的方法时才有意义接口:
public interface DefaultMethods {
public int getValue();
public default int getValueIncremented() {
if (UtilityMethod.helper()) { // never executed, just to demonstrate possibilities
"string".charAt(0); // does nothing, just to show you can call instance methods
return 0;
}
return 1 + getValue();
}
public static class UtilityMethod {
public static boolean helper() {
return false;
}
}
}
否 - 在 java 8 中,您不能在接口中没有 public static final 字段,不幸的是。
但我希望将来这会被添加到语言中。
Scala 允许与非静态字段进行接口,这为代码重用和组合开辟了比 Java 8
中更多的可能性我强烈不建议这样做。请改用抽象 classes。但是如果你真的需要它,你可以用一些包装器 class 做一些变通技巧。这是一个例子:
public interface TestInterface {
StringBuilder best = new StringBuilder();
default void test() {
best.append("ok");
System.out.print(best.toString());
}
}