我正在努力开发一种可编译为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;
}
}
}
之所以要这样做,是因为一个人不能通过提供自己的应由另一人实施的事物的实现来弄乱任何其他人的代码。
任何帮助将不胜感激。
答案 0 :(得分:2)
我很确定您应该重新考虑您要尝试做的事情并更改方法,但是您的问题的答案是向接口添加一些空的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) {}
}
}
但是,正如我说的那样,我不喜欢这样,对我来说,这意味着您的想法已被破坏