JLS strictfp Interfaces指定:
和JLS strictfp Classes:
从这两段中,并没有迹象表明在实现/扩展使用strictfp
修饰符声明的接口(interface)/类时strictfp
的行为。
搜索之后,我找到了关于strictfp
关键字Use the strictfp modifier for floating-point calculation consistency across platforms用法的很好解释,它指定了:
它添加了:
我在扩展用strictfp
关键字声明的类时测试了strictfp
关键字的行为,这是事实:扩展类的类未继承strictfp
行为,但是问题是在实现用strictfp
关键字声明的接口(interface)时不正确:strictfp
行为是不能被实现该接口(interface)的类所继承。
任何人都可以通过实现/扩展用strictfp
修饰符声明的接口(interface)/类来解释strictfp
的正确行为吗?
最佳答案
这是我为调查您的问题所做的实验。下面的代码使用反射API检查在各种情况下是否声明了strictfp
。
结论:
总结一下-如果在接口(interface)上声明了
strictfp
,那么所有非抽象代码-默认方法,带有方法的内部类-都会自动变成strictfp
。请注意,
strictfp
修饰符不适用于抽象方法。import java.lang.reflect.Modifier;
strictfp interface StrictInterface {
void someInterfaceMethod();
default void someInterfaceDefaultMethod() {}
class InnerTest {
public static void innerMethod() {}
}
}
class Impl implements StrictInterface {
@Override
public void someInterfaceMethod() {}
public strictfp void someClassMethod() {}
public void someClassMethod2() {}
}
public class Test {
public static void main(String argv[]) {
checkModifiers(Impl.class, "someInterfaceMethod");
checkModifiers(Impl.class, "someClassMethod");
checkModifiers(Impl.class, "someClassMethod2");
checkModifiers(Impl.class.getInterfaces()[0], "someInterfaceDefaultMethod");
checkModifiers(StrictInterface.InnerTest.class, "innerMethod");
}
public static void checkModifiers(Class clazz, String m) {
try {
int mod = clazz.getDeclaredMethod(m, new Class[0]).getModifiers();
String res = m + " modifiers: " + Modifier.toString(mod);
System.out.println(res);
} catch (Exception e) {
e.printStackTrace(System.out);
}
}
}
程序的输出:(在OSX上使用jdk1.8.0_91.jdk)
someInterfaceMethod modifiers: public
someClassMethod modifiers: public strictfp
someClassMethod2 modifiers: public
someInterfaceDefaultMethod modifiers: public strictfp
innerMethod modifiers: public static strictfp
关于java - 实现/扩展接口(interface)/类时strictfp关键字的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39254659/