Java 带有列表的JPA抽象继承<;抽象类>;
我的代码:Java 带有列表的JPA抽象继承<;抽象类>;,java,jpa,generics,inheritance,Java,Jpa,Generics,Inheritance,我的代码: @MappedSuperclass 公共抽象类标题{ 公共摘要列表getLines(); } @实体 公共类ChildHeader扩展了Header{ @独身癖 公共列表getLines(); } @映射超类 公共抽象类行{ 公共摘要头getHeader(); } @实体 公共类子行扩展了子行{ @许多酮 public ChildHeader getHeader(); } 问题:“ChildHeader”中的错误消息“error:”getLines()”与“Header”中的“ge
@MappedSuperclass
公共抽象类标题{
公共摘要列表getLines();
}
@实体
公共类ChildHeader扩展了Header{
@独身癖
公共列表getLines();
}
@映射超类
公共抽象类行{
公共摘要头getHeader();
}
@实体
公共类子行扩展了子行{
@许多酮
public ChildHeader getHeader();
}
问题:“ChildHeader
”中的错误消息“error:”getLines()
”与“Header
”中的“getLines()
”冲突;试图使用不兼容的返回类型”
尝试的解决方案:将List
更改为List
并将List
更改为List
新错误:“ChildHeader
”中的“getLines()
”与“Header
”中的“getLines()
”冲突;两种方法具有相同的擦除,但都不重写另一种方法
尝试的解决方案:尝试使用行[]
和子行[]
而不是列表
新错误:“列表/数组必须用@OrderColumn
(或@IndexColumn
)注释”,但没有排序列。数组的顺序并不重要,但似乎@OneToMany
或JPA需要一个
这是不可能的情况。我能做什么呢?由于ChildHeader的“getLines”并没有覆盖Header的声明(鉴于它是一个抽象方法,最终将不得不这样做),出于所有意图和目的,您正试图通过不同的返回类型来重载该方法
在Java中,这是不允许的
有什么原因不能像这样重写Header的“getLines”方法:
@Entity
public class ChildHeader extends Header{
@OneToMany
public List<Line> getLines();
// since this isn't an abstract class, there
// should be an implementation here
}
@实体
公共类ChildHeader扩展了Header{
@独身癖
公共列表getLines();
//因为这不是一个抽象类,所以
//应该在这里实现
}
由于“ChildLine”扩展了“Line”,您仍然可以返回一个只有“ChildLine”的列表。您只需要确保在调用这样一个方法时,行列表中的那些“子行”被转移到子行列表中
类似的逻辑也适用于line类。ChildLine试图从第行重载“getHeader()”,而通过确保其返回类型匹配可以更容易地重写该方法。因为ChildHeader的“getLines”并没有重写Header的声明(鉴于它是一个抽象方法,最终将不得不这样做),出于所有意图和目的,您正试图通过不同的返回类型重载该方法
在Java中,这是不允许的
有什么原因不能像这样重写Header的“getLines”方法:
@Entity
public class ChildHeader extends Header{
@OneToMany
public List<Line> getLines();
// since this isn't an abstract class, there
// should be an implementation here
}
@实体
公共类ChildHeader扩展了Header{
@独身癖
公共列表getLines();
//因为这不是一个抽象类,所以
//应该在这里实现
}
由于“ChildLine”扩展了“Line”,您仍然可以返回一个只有“ChildLine”的列表。您只需要确保在调用这样一个方法时,行列表中的那些“子行”被转移到子行列表中
类似的逻辑也适用于line类。ChildLine试图从第行重载“getHeader()”,而通过确保返回类型匹配,可以更容易地重写该方法
“这是不可能的情况……”
如果您遵循有关重写实例方法的指导,则不会
8.4.8.1.覆盖(通过实例方法)
类C
中声明或继承的实例方法m
C
,重写类A
中声明的另一方法m
A
,如果以下所有条件均为真:
m
的签名是C
m
签名的子签名()a
M
和N
,如果它们具有相同的名称,相同的类型参数(如果有)(),则具有相同的签名,并且,在将N
的形式参数类型调整为M
的类型参数之后,相同的形式参数类型
错误的症结在于您的方法不符合JLS的标准
“我能做什么?”
如果您重构了标题
类
public abstract class Header {
public abstract < L extends Line > List< L > getLines( );
}
public class ChildHeader extends Header {
@Override
@SuppressWarnings("unchecked")
public < C extends Line > List< C > getLines(){ … }
}
那你就可以
…
Header=newchildheader();
Listlines=header.getLines();
ChildHeader-ChildHeader=lines.get(0.getHeader();
…
“这是不可能的情况……”
如果您遵循有关重写实例方法的指导,则不会
8.4.8.1.覆盖(通过实例方法)
类C
中声明或继承的实例方法m
C
,重写类A
中声明的另一方法m
A
,如果以下所有条件均为真:
m
的签名是C
m
签名的子签名()a
M
和N
,如果它们具有相同的名称,相同的类型参数(如果有)(),则具有相同的签名,并且,在将N
的形式参数类型调整为M
的类型参数之后,相同的形式参数类型
错误的症结在于您的方法不符合JLS的标准
“我能做什么?”
如果您重构了标题
类
public abstract class Header {
public abstract < L extends Line > List< L > getLines( );
}
public class ChildHeader extends Header {
@Override
@SuppressWarnings("unchecked")
public < C extends Line > List< C > getLines(){ … }
}
那你呢