Java - 类字段 / 方法 getInt

5

我有一个仅包含int值的接口(实质上,它与枚举相似)。

我想要遍历接口值,使用以下代码:

for (Field x : MyInterface.class.getDeclaredFields())
{
    int y = x.getInt(x);
    // do something with 'y'...
}

以我看来,要么getInt方法可以是静态的,要么它不需要任何参数。
那么为什么这个方法需要'this'和额外的参数呢?
它们有可能不同吗?

2
尝试将null作为参数传递:它也应该可以工作。 - sp00m
1
@sp00m:谢谢...不过还是没有回答我的问题... - barak manos
@barakmanos - 接口中不能有静态方法。 - TheLostMind
@TheLostMind:我在询问Field类中的一个方法,请仔细阅读问题。 - barak manos
@noone:我有一个接口(不是我的,所以我不能改变它),我正在尝试使用(内置的)Field类迭代其int值。因此,我在询问Field类中的方法问题,而不是关于接口或类的一般性问题。谢谢。 - barak manos
在这种情况下,我的答案仍然应该有效,并解释该方法和参数的实际含义。 - noone
1个回答

2
int y = x.getInt(x);

这实际上是错误的,毫无意义。 Field.getInt 的 JavaDoc 如下所示:
参数: obj - 从中提取 int 值的对象
返回值: 转换为 int 类型的字段值 Field 是一个类的“全局”定义。如果您想访问该类某个特定实例的字段值,则需要将该实例提供给 getField(Object) 方法。
它甚至进一步说明:
抛出: IllegalArgumentException - 如果指定的对象不是声明底层字段的类或接口的实例(或其子类或实现者),或者如果字段值无法通过扩展转换转换为 int 类型。 NullPointerException - 如果指定的对象为 null 并且字段为实例字段。
因此,在注释中建议提供 null 是不正确的,除非该字段是静态字段。您也不能使用字段本身(x)作为参数,因为它不是该类的实例。
在您的特定情况下,当字段在 interface 中定义时,所有字段都自动成为 static final。因此,您可以提供 null 作为参数,因为没有需要的其他信息。
但是,由于此 Field 方法也可用于其他情况(非静态情况),因此需要这个参数。

请仔细阅读问题中的代码:'x' 是 Field 类的一个实例。为了调用 getInt 方法,我必须使用这个实例,因为该方法不是静态的。那么为什么这个方法一开始就不是静态的呢?或者换句话说,为什么它需要一个参数? - barak manos
@barakmanos 我回答了你的问题,并在答案末尾添加了一些更具体的信息,以使其更清楚。 - noone
“该字段本身(x)不是该类的实例”?当我声明“Field x”时,“x”是哪个类的实例? - barak manos
@barakmanos x是Field的一个实例,而不是MyInterface(这是非静态情况下唯一被接受的类型。在静态情况下它并不重要,因为它没有被使用。) - noone
在Field类中,为什么getInt方法不是静态的?使用Field实例和额外参数调用此方法有什么意义?在什么情况下,您会使用Field实例并且所需参数与其不同? - barak manos
@barakmanos 你需要明白,你的情况其实是非常特殊的,因为你的字段是静态的。在这种情况下,你是正确的,额外的参数是不需要的(因此你可以提供null甚至是字段本身),并且它也不会被使用。但正常情况是非静态的。那么你需要明白,你可能有两个类的实例。但你只有一个“Field”实例。如何让“Field”知道它应该从哪个实例中提取字段值?它无法做到,因此你需要提供实例作为额外的参数。 - noone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接