这是问题,当我定义这样的界面时:
package mypackage;
public interface Ainterface {
int VAL = 6;
}
然后我定义了一个类:
public class Aclass implements Ainterface {
private String[] str = new String[VAL];
public static void main(String[] args) { ... }
}
当我编译程序时,会显示错误消息:找不到符号“VAL”。
符号:VAL
职位:Aclass
答案 0 :(得分:6)
当我编译程序时,会显示错误消息:找不到符号“VAL”。
这是 only 编译器错误消息吗?如果是,请goto wtf;
。
如果不是,是否有任何其他编译器错误消息等同于编译器说它也找不到Ainterface
?如果是这样,您的问题很简单。似乎Aclass
位于不同的包中,或者您希望它位于同一个包中。在前一种情况下,您需要import mypackage.Ainterface
。在后一种情况下,您需要将Aclass
与package mypackage
放在同一个包中。
您能否制作一个显示问题的最小工作示例?问题在于:我必须非常努力地重现你的问题,而且你不太可能遇到这个问题。
几乎没有可能。
一个。 Ainterface
和Aclass
位于同一个包中。在这种情况下,应该没有问题。
Ainterface.java:
package mypackage;
public interface Ainterface {
int VAL = 6;
}
Aclass.java
package mypackage;
public class Aclass implements Ainterface {
private String[] str = new String[VAL];
public static void main(String[] args) { }
}
湾Ainterface
和Aclass
位于不同的包中。在这种情况下,必须是import mypackage.Ainterface
java
源文件中的Aclass
导入语句package mypackage;
public interface Ainterface {
int VAL = 6;
}
Aclass.java:
package myotherpackage;
import mypackage.Ainterface;
public class Aclass implements Ainterface {
private String[] str = new String[VAL];
public static void main(String[] args) { }
}
。在这种情况下,应该没有问题。
Ainterface
在这两种情况下,代码都将按编译。这些都不会产生问题,而且它们是唯一有意义的两种可能性。还有第三种可能性。请告诉我它不这个。您有两个 此将产生错误。并且,要明确的是,这个可以意外发生。假设您定义Aclass
已定义,一个在一个包中,一个在另一个包中,package
位于与未定义VAL
的定义相同的Ainterface.java:
package mypackage;
public interface Ainterface {
int VAL = 6;
}
Ainterface.java:
package myotherpackage;
public class Ainterface {
}
Aclass.java:
package myotherpackage;
public class Aclass implements Ainterface {
private String[] str = new String[VAL];
public static void main(String[] args) { }
}
中:< / p>
Ainterface
mypackage
并将其放在Aclass
中。假设您定义mypackage.Ainterface
并且未将其放在同一个包中而忘记导入Ainterface
。如果您使用的是像Eclipse这样的IDE,您将收到一条错误消息,{{1}}无法解析为某种类型,并且您将有三种快速修复:“导入'Ainterface'(mypackage)”, “创建界面'Ainterface'”,“修复项目设置......”。如果你不小心点击了第二个选项,你最终会遇到这种情况。但这只是愚蠢的,不能成为你的意图。所以,帮助我们帮助你。
答案 1 :(得分:1)
您应该以静态方式引用VAL,因为接口中定义的所有变量都是默认public
,static
和final
。这应该有效:
private String[] str = new String[Ainterface.VAL];
答案 2 :(得分:1)
除了方法声明之外,接口还可以包含常量声明。界面中定义的所有常量值都隐式 public,static和final 。再一次,可以省略这些修饰符。查看this了解详情。
因此,为了访问它,请使用Ainterface.VAL
(因为在接口中定义的变量是静态的)。
private String[] str = new String[Ainterface.VAL];
答案 3 :(得分:0)
如果存在于同一个包中,这样可以正常工作,但如果您希望将这些文件放在不同的包中,则可以执行以下任一操作。
选项1:
Import mypackage;
<{1>}文件中的
选项2:
或者使用Aclass.java
更改VAL
,然后声明变为
Ainterface.VAL