Spring Data JPA にて QueryDSL のコンパイルを実行すると「エラー: 不適合な型: Class<CAP#1>」のコンパイルエラーが発生した話

More than 1 year has passed since last update.


概要

下記のようなクラス構成にした際、QueryDSL にて生成されたソースがコンパイルエラーを起こしました。


Employee.java

@Entity

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Getter
public abstract class Employee<T extends EmployeeWorkTime> extends AbstractEmployee {

@Transient
protected T EmployeeWorkTime employeeWorkTime;
}



CompanyEmployee.java

@Getter

@MappedSuperclass
public abstract class CompanyEmployee<T extends EmployeeWorkTime> extends Employee<T> {

protected abstract T createEmployeeWorkTime(int workTime);

}



RegularEmployee.java

@Entity

@DiscriminatorValue("REGULAR")
@Getter
public class RegularEmployee extends CompanyEmployee {

@Override
protected RegularWorkTime createEmployeeWorkTime(int workTime) {
return new RegularWorkTime(workTime);
}
}



  • 出力されたコンパイルエラーのログ


:generateQueryDSL

/Users/user/Documents/workspace/Project/src/main/generated/project/domain/employee/QRegularEmployee.java:74: エラー: 不適合な型: ClassをClass<? extends CompanyEmployee<? extends EmployeeWorkTime>>に変換できません:

this._super = new project.domain.employee.QCompanyEmployee(type, metadata, inits);

^

CAP#1が新しい型変数の場合:

CAP#1は? extends CompanyEmployeeのキャプチャからCompanyEmployeeを拡張します

注意:入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。

注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。

注意:一部のメッセージは簡略化されています。-Xdiags:verboseで再コンパイルして完全な出力を取得してください



原因と回避策

警告にて出力されているとおり、型安全が確保されていないために発生しておりました。

RegularEmployee クラスにて継承しているクラスへの型パラメーターを指定することで正常なソースファイルが QueryDSL にて出力され、コンパイルエラーを含む問題が解消致しました。


RegularEmployee.java

@Entity

@DiscriminatorValue("REGULAR")
@Getter
public class RegularEmployee extends CompanyEmployee<RegularWorkTime> {

@Override
protected RegularWorkTime createEmployeeWorkTime(int workTime) {
return new RegularWorkTime(workTime);
}
}


警告を放置せず、きちんと型安全で書きましょう、というシクリでしょうか。