Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 带有列表的JPA抽象继承<;抽象类>;_Java_Jpa_Generics_Inheritance - Fatal编程技术网

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
    签名的子签名()

特别注意

8.4.2.方法签名 两个方法或构造函数,
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
    签名的子签名()

特别注意

8.4.2.方法签名 两个方法或构造函数,
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(){ … }
}
那你呢