F-Droid で公開したい ORMLite ライブラリを使用した Android プロジェクトがあります。プロジェクトは Eclipse で問題なくコンパイルされます。ただし、F-Droid は ant を使用してプロジェクトをビルドし、以下の (要約された) コードのエラーでプロジェクトのビルドに失敗します。
private Dao<Habit, Integer> habitDao;
private Dao<Day, Integer> dayDao;
public Dao<Habit, Integer> getHabitDao() throws SQLException {
if (habitDao == null) {
habitDao = getDao(Habit.class);
}
return habitDao;
}
public Dao<Day, Integer> getDayDao() throws SQLException {
if (dayDao == null) {
dayDao = getDao(Day.class);
}
return dayDao;
}
エラーは、habitDao = getDao(Habit.class) および dayDao = getDao(Day.class) 行にあり、次のエラー メッセージが表示されます。
type parameters of D cannot be determined; no unique maximal instance exists for type variable D with upper bounds com.j256.ormlite.dao.Dao,com.j256.ormlite.dao.Dao
これは、https: //groups.google.com/forum/?fromgroups=# !topic/ormlite-android/rUVI0d-khKk で説明されている問題と同じであり、おそらく Java コンパイラのバグです。
現在、私は専門の開発者ではないため、明示的なキャストを追加することの意味は直感的ではありません。コードを変更した方法は次のとおりです。
public Dao<Habit, Integer> getHabitDao() throws SQLException {
if (habitDao == null) {
habitDao = getDao(Habit.class);
}
return (Dao<Habit, Integer>)habitDao;
}
public Dao<Day, Integer> getDayDao() throws SQLException {
if (dayDao == null) {
dayDao = getDao(Day.class);
}
return (Dao<Day, Integer>)dayDao;
}
これで問題は解決し、ant は私の側でプロジェクトを正常にビルドし、アプリは問題なく動作しました。ただし、F-Droid の ant ビルド プロセスは、上記と同じエラーで失敗しました。私のアリに関する限り、これを自分の側で「デバッグ」することができなくなったため、私は迷っています。プロジェクトに問題はないため、私が行う変更は純粋な当て推量です。
その後、もう1つ試しました:
@SuppressWarnings("unchecked")
public Dao<Habit, Integer> getHabitDao() throws SQLException {
if (habitDao == null) {
habitDao = (Dao<Habit, Integer>)getDao(Habit.class);
}
return (Dao<Habit, Integer>)habitDao;
}
@SuppressWarnings("unchecked")
public Dao<Day, Integer> getDayDao() throws SQLException {
if (dayDao == null) {
dayDao = (Dao<Day, Integer>)getDao(Day.class);
}
return (Dao<Day, Integer>)dayDao;
}
しかし、これは単なる推測であり、F-Droid 側では、ビルド プロセスは依然として同じエラーで失敗します。
これを修正する方法についてのアドバイスは大歓迎です。
編集: このアプリはオープン ソースであるため、ant を使用して独自にビルドしたい人は誰でも大歓迎です: https://github.com/blaztriglav/did-i