Следующий код не компилируется:
public class GenericsTest {
public static void main(String[] args) {
MyList<?> list = new MyList<Object>();
Class<?> clazz = list.get(0);
// Does not compile with reason
// "Type mismatch: cannot convert from Object to Class"
MyList list2 = new MyList();
Class clazz2 = list2.get(0);
}
static class MyList<T> extends ArrayList<Class<T>> {
}
}
Я хотел сделать это для того, чтобы ввести дженерики в старый код, не нарушая сборки.
Это ошибка в компиляторе (и eclipse, и javac), или я что-то здесь упускаю? Какая еще возможность представить дженерики в MyList?
EDIT
Для уточнения:
У меня есть родовой класс
public class MyList extends ArrayList<MyObject> {}
с
public class MyObject {}
и код с использованием MyList
MyList list = new MyList();
...
MyObject o = list.get(0);
Теперь, во время разработки, я вижу, что хочу ввести дженерики в MyObject
public class MyObject<T> {}
и теперь я хочу, чтобы эта новая универсальная штука также была в MyList
public class MyList<T> extends ArrayList<MyObject<T>> {}
Но это ломает мою сборку. Интересно
public class MyList<T> extends ArrayList<MyObject<T>> {
public MyObject<T> get(int i) {
return super.get(i);
}
}
разрешит старый код
MyList list = new MyList();
...
MyObject o = list.get(0);
для компиляции.
Хорошо, кажется, что когда я представлю этот универсальный шаблон, мне придется смириться с необходимостью изменить все вызовы MyList на универсальный формат. Я хотел, чтобы старый код просто выдавал предупреждение вместо ошибки.