这是我有三个接口的代码
interface i1{
int x=1;
}
interface i2{
int x=2;
}
interface i3{
int x=3;
}
class A implements i1,i2,i3{
system.out.println(x); // It shows Field is ambgous
}
如何回答这个问题或如何克服这个问题。
如何回答这个问题或如何克服这个问题。
不要在接口中使用字段,或者如果您必须使用它们,并且它们必须具有相同的名称,只需完全限定它们:
System.out.println(i3.x);
请注意,使用import static
,导入包含常量的接口的“简洁”原因被删除 - 接口实际上应该仅出于真正的行为原因而实现。有关这方面的更多建议,请参阅 Effective Java 2nd edition。
这是因为在所有接口中都定义了相同的字段,因此它不知道在这 3 中使用哪个字段。
System.out.println
而不是system
此外,您的类型名称应以大写字母开头
interface I1{
int x=1;
}
interface I2{
int x=2;
}
interface I3{
int x=3;
}
class A implements I1,I2,I3{
static{
System.out.println(I1.x);
}
}
在所有 3 个接口变量中 x 都在那里,所以它显示不明确。编译器混淆从 i1 或 i2 或 i3 打印哪个 x
接口旨在展示类结构。如果您必须在多个接口中声明字段并在一个类中使用所有这些接口,则应显式声明您为该变量使用的接口。
System.out.println(i3.x);
您还可以extends
在接口中使用关键字通过设置继承来减少歧义。
interface i1{int x=1;}
interface i2 extends i1 {...}
interface i3 extends i2 {...}
class A implements i3{...}
A 类必须实现在 i1、i2 和 i3 中声明的所有函数。
不要这样做。这称为常量接口反模式。或者只使用完全限定的名称。
*强文本*尽管许多人已经给出了这个问题的答案。
但有一些详细的分析。
interface I1{
int x=1;
}
interface I2{
int x=2;
}
interface I3{
int x=3;
}
class A implements I1,I2,I3{
static{
System.out.println(I1.x);
}
}
整数 x 是公共最终整数 x。编译器在内部将其转换为最终手段将其视为常量。
这就是为什么当用户打印 x 的值时,编译器会为此给出模棱两可的错误。
要实际实现这一点,请使用 jdk 中的 -javap 工具。
用法:javap I1