JLS strictfp Interfaces指定:

JLS strictfp Classes:

从这两段中,并没有迹象表明在实现/扩展使用strictfp修饰符声明的接口(interface)/类时strictfp的行为。
搜索之后,我找到了关于strictfp关键字Use the strictfp modifier for floating-point calculation consistency across platforms用法的很好解释,它指定了:

它添加了:
java - 实现/扩展接口(interface)/类时strictfp关键字的行为-LMLPHP
我在扩展用strictfp关键字声明的类时测试了strictfp关键字的行为,这是事实:扩展类的类未继承strictfp行为,但是问题是在实现用strictfp关键字声明的接口(interface)时不正确:strictfp行为是不能被实现该接口(interface)的类所继承。
任何人都可以通过实现/扩展用strictfp修饰符声明的接口(interface)/类来解释strictfp的正确行为吗?

最佳答案

这是我为调查您的问题所做的实验。下面的代码使用反射API检查在各种情况下是否声明了strictfp

结论:

  • strictfp接口(interface)中声明的抽象方法在实现
  • 接口(interface)的类中不是strictfp
  • strictfp接口(interface)中声明的默认方法将在实现接口(interface)
  • 的类中为stricfp
  • 实现 strictfp接口(interface)的类中的方法不会自动使用strictfp
  • strictfp接口(interface)内部类中声明的所有方法都将具有stricfp修饰符

  • 总结一下-如果在接口(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/

    10-10 06:01