Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以注释从超类继承的成员吗?_Java_Inheritance_Annotations - Fatal编程技术网

Java 我可以注释从超类继承的成员吗?

Java 我可以注释从超类继承的成员吗?,java,inheritance,annotations,Java,Inheritance,Annotations,如果我有以下课程: class Person { private String name; ...constructor, getters, setters, equals, hashcode, tostring... } 我是否可以对子类中的name字段进行子类化并应用注释,例如应用持久性注释,而无需重新实现类的其余部分 @Entity class Employee extends Person { @Column(...) private String name;

如果我有以下课程:

class Person {
  private String name;
  ...constructor, getters, setters, equals, hashcode, tostring...
}
我是否可以对子类中的name字段进行子类化并应用注释,例如应用持久性注释,而无需重新实现类的其余部分

@Entity
class Employee extends Person {
    @Column(...)
    private String name;
}
不,你不能

您建议的是字段阴影-您不能覆盖字段

子类中的字段
name
与超类中的字段
name
没有任何关系,只是它与“name”同名,因此为了区分超类中的字段,必须在子类中将其称为
super.name


这样做通常被认为是一个“bug”(或者是一个潜在的bug),最好的做法是不要对字段进行阴影处理,因为在不知道的情况下很容易引用错误的字段。

这是行不通的,因为超类中的字段不会受到影响,但您可以尝试这样做

@Entity
class Employee extends Person {
  @Column(name="xxx")
  @Override
  public void setName(String name) {
     super.setName(name);
  }
  ...

否-您将得到两个不同的字段。
Employee
中带注释的名称字段将隐藏
Person
类中的名称字段
Person.name
将不会被注释。

延迟回答,但我认为覆盖getter方法是一种可靠的方法

这可以是具有id字段的所有表的超类。如果将此对象序列化为JSON,则id将始终显示

@MappedSuperclass
class ModelEntity {

    @Id
    @Column(
        name      = "id",
        updatable = false,
        nullable  = false
    )
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Long id
}
但是假设您有以下对象(表)
Person
occulation
,其中
Person
occulation
有一对多关系

@Entity
@Table(name = "occupation")
Occupation extends ModelEntity {

    @Column
    String company

    @Column 
    String position
}

@Entity
@Table(name = "person")
Person extends ModelEntity {

    @Column
    String name

    @OneToMany
    Occupation occupation
}
假设id存在于扩展
modeleentity
的所有类中,如果要序列化
Person
对象,您将得到如下结果:

{
    "id" : 1,
    "name" : "Jordan",

    "occupation" : {
        "id" : 1,
        "company" : "WalMart",
        "position" : "Engineer"
    }

}
如果您不希望id显示在
occulation
对象中,但确实希望它显示在
Person
对象中,则可以在
occulation
类级别实现
getId()
方法,并应用所需的注释:

@Transient
public Long getId() {

    return id;   
}
现在,JSON将显示如下:即使它们在实际数据库中都有一个id列:

{
    "id" : 1,
    "name" : "Jordan",

    "occupation" : {
        "company" : "WalMart",
        "position" : "Engineer"
    }

}

您可以重写getter/setter并将
@列放在那里。对于重写的(
@override
)getter方法,这也很有效,而且更清楚。我认为您没有抓住要点。问题是对在超类中定义的成员进行注释,而不是对其进行阴影处理。@david问题是希望通过“覆盖”该字段来向超类字段添加注释,但您不能这样做;OP已经遮蔽了超类场,它没有超类场的效果。不能从子类中注释超类的成员。