无法为接口分配最终字段

时间:2010-12-14 10:37:03

标签: java interface

我有一个产品类和一个接口LargeProduct。产品实现LargeProduct。

LargeProduct具有可变高度,其具有必须在Product类中实现的getter和setter方法。

LargeProduct中的height变量定义如下:

public int height = null;

getter方法运行正常:

public int getHeight() {
    return height;
}

但是setter方法没有:

public void setHeight(int height) {
    this.height = height;
}

错误:

The final field LargeProduct.height cannot be assigned
The static field LargeProduct.height should be accessed in a static way

我不确定它实际给出了哪个错误..我正在使用Eclipse,当我悬停它时会出现第一个错误,并且在窗口底部会出现第二个错误。

5 个答案:

答案 0 :(得分:15)

接口只能包含常量,而不能包含通用变量。接口应包含常量,如果它们与接口的其余部分真正相关,并且它们应该根据任何其他常量使用SHOUTY_CASE。听起来LargeProduct 不应该有一个名为height的常量 - 但是,您的实现应该声明height字段。

请注意,接口应该是API,显示类型的功能。字段不应该是API的一部分 - 它们是实现细节。毕竟,谁会说你会根据一个简单的变量写getHeightsetHeight?这些方法可以查询数据库,或委托给其他类型的实例。界面的消费者不应该知道或关心它。

有关界面中字段的更多信息,建议您阅读section 9.3 of the Java Language Specification

  

接口主体中的每个字段声明都是隐式的public,static和final。允许为这些字段冗余地指定任何或所有这些修饰符。

答案 1 :(得分:2)

  

LargeProduct中的高度变量是   定义如下:

public int height = null;

接口中定义的变量是隐式staticfinal,即常量。这就是编译器所抱怨的。

您无法在界面中定义实例变量。只需将其保留 - get和set方法确保可以按预期使用类。实际变量是实现类的实现细节。

答案 2 :(得分:1)

默认情况下,界面中的字段(成员变量)为 public static final

并且您没有 final

的setter

答案 3 :(得分:0)

您无法为最终字段指定值。将Product中的高度声明为

private int height;

答案 4 :(得分:0)

完全是org.life.java!而你无法修改静态最终变量!因为这是在Java中确定常量的方法。