0

这是我有三个接口的代码

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
}

如何回答这个问题或如何克服这个问题。

4

6 回答 6

5

如何回答这个问题或如何克服这个问题。

不要在接口中使用字段,或者如果您必须使用它们,并且它们必须具有相同的名称,只需完全限定它们:

System.out.println(i3.x);

请注意,使用import static,导入包含常量的接口的“简洁”原因被删除 - 接口实际上应该仅出于真正的行为原因而实现。有关这方面的更多建议,请参阅 Effective Java 2nd edition。

于 2013-09-23T10:20:56.020 回答
0

这是因为在所有接口中都定义了相同的字段,因此它不知道在这 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);
}

}
于 2013-09-23T10:20:19.820 回答
0

在所有 3 个接口变量中 x 都在那里,所以它显示不明确。编译器混淆从 i1 或 i2 或 i3 打印哪个 x

于 2013-09-23T10:20:53.297 回答
0

接口旨在展示类结构。如果您必须在多个接口中声明字段并在一个类中使用所有这些接口,则应显式声明您为该变量使用的接口。

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 中声明的所有函数。

于 2013-09-23T10:32:28.153 回答
0

不要这样做。这称为常量接口反模式。或者只使用完全限定的名称。

于 2013-09-23T11:04:09.540 回答
0

*强文本*尽管许多人已经给出了这个问题的答案。

但有一些详细的分析。

  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

于 2013-09-23T11:23:38.607 回答