LoginSignup
0
1

More than 5 years have passed since last update.

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

Posted at

概要

下記のようなクラス構成にした際、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);
    }
}

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1