Ошибка компиляции дженериков - PullRequest
2 голосов
/ 23 февраля 2012

Ошибка появляется в проекте Android с использованием ormlite. Я получаю ошибку компиляции по этому коду:

public class DatabaseModel {
        private Dao<Object, Integer> mDao = null;
        private DatabaseHelper mHelper;
        private Class<?> mClass;

        public DatabaseModel(DatabaseHelper h, Class<?> c) {
                mHelper = h;
                mClass = c;
                try {
                        mDao = mHelper.getDao(mClass);
                } catch (SQLException e) {
                        Debug.e("Can't get dao", e.getStackTrace());
                        throw new RuntimeException(e);
                }
        }

on line 25 mDao = mHelper.getDao(mClass);

Error: type parameters of <D>D cannot be determined; no unique maximal
instance exists for type variable D with upper bounds
     com.j256.ormlite.dao.Dao<java.lang.Object,java.lang.Integer>,
     com.j256.ormlite.dao.Dao<capture#296 of ?,?>

Но когда я пытаюсь построить проект с использованием Eclipse, он работает нормально

Ошибка выглядит аналогично1006 * на этот вопрос SO .

Я не знаю, является ли эта ошибка Idea или javac.

Моя конфигурация: IntelliJ IDEA 11.0.2 Build # IC-111.277 Встроенный1 Февраль 2012 г.JDK: 1.6.0_29 VM: 64-разрядный сервер Java HotSpot (TM) VM Производитель: Apple Inc.

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Я не получаю эту ошибку в затмении, но я понимаю, почему вы видите проблему. mdao определяется как Dao<Object, Integer>, но вы звоните getDao(mClass), где mclass является Class<?> Объект! =? на родовой земле.

Вы можете превратить весь ваш класс в универсальный тип. Будет работать что-то вроде следующего.

public class DatabaseModel<T, ID> {
    private Dao<T, ID> mDao = null;
    private DatabaseHelper mHelper;
    private Class<T> mClass;

    public DatabaseModel(DatabaseHelper h, Class<T> c) {
        mHelper = h;
        mClass = c;
        try {
            mDao = mHelper.getDao(mClass);
        } catch (SQLException e) {
            Debug.e("Can't get dao", e.getStackTrace());
            throw new RuntimeException(e);
        }
    }
}

Это должно сработать.

0 голосов
/ 13 августа 2012

В моем случае я мог бы обойти проблему, используя getDataDao() вместо getDao().

...