概要
下記のようなクラス構成にした際、QueryDSL にて生成されたソースがコンパイルエラーを起こしました。
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Getter
public abstract class Employee<T extends EmployeeWorkTime> extends AbstractEmployee {
@Transient
protected T EmployeeWorkTime employeeWorkTime;
}
@Getter
@MappedSuperclass
public abstract class CompanyEmployee<T extends EmployeeWorkTime> extends Employee<T> {
protected abstract T createEmployeeWorkTime(int workTime);
}
@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 にて出力され、コンパイルエラーを含む問題が解消致しました。
@Entity
@DiscriminatorValue("REGULAR")
@Getter
public class RegularEmployee extends CompanyEmployee<RegularWorkTime> {
@Override
protected RegularWorkTime createEmployeeWorkTime(int workTime) {
return new RegularWorkTime(workTime);
}
}
警告を放置せず、きちんと型安全で書きましょう、というシクリでしょうか。