猿问

无法实现的Java可见界面

我正在开发一种可以编译为 JVM 字节码的编程语言,它高度依赖接口作为类型。我需要一些方法来使接口私有,但让其他代码仍然能够访问它,但不能实现它。


我正在考虑使用带有私有构造函数的抽象类,因此只有同一文件中的类才能访问它。唯一的问题是一次扩展多个抽象类是不可能的。例如,一个简单的编译程序的结构是这样的:


// -> Main.java

public class Main {

    public static MyInteger getMyInteger() {

        return new MyIntegerImpl(10);

    }


    public static void main(String[] args) {}


    private interface MyInteger {

        public int getValue();

    }


    private static class MyIntegerImpl implements MyInteger {

        private final int value;


        public int getValue() {

            return value;

        }


        public MyIntegerImpl(int value) {

            this.value = value;

        }

    }

}

还有另一个文件,其中存在问题:


// -> OtherFile.java

public class OtherFile {

    public static void main(String[] args) {

        Main.MyInteger myInteger = Main.getMyInteger(); //Error: The type Main.MyInteger is not visible.

        System.out.println(myInteger.getValue());

    }


    //I do not want this to be allowed

    public static class sneakyInteger implements Main.MyInteger { //Error(Which is good)

        public int getValue() {

            System.out.println("Person accessed value");

            return 10;

        }

    }

}

我想这样做的原因是,一个人不能通过提供自己的实现来搞乱任何其他人的代码,而这些实现应该只能由其他人实现。


任何帮助将非常感激。


繁花如伊
浏览 70回答 1
1回答

慕尼黑8549860

我很确定您应该再次考虑您要做什么并更改方法,但是您问题的答案是向接口添加一些空void方法,该方法正在获取特定于包装器类的内部private类的参数public class Test {    private class InnerPrivateClass {        private InnerPrivateClass() {}    }    public interface MyInteger {        int getValue();        void accept(InnerPrivateClass c);    }    private class MyIntegerImpl implements MyInteger {        @Override        public int getValue() {            return 0;        }        @Override        public void accept(InnerPrivateClass c) {}    }}但是,正如我所说,我不喜欢这样,对我来说,这意味着你的想法被打破了
随时随地看视频慕课网APP

相关分类

Java
我要回答