Необработанные типы с универсальными методами, независимыми от универсального типа
Это продолжение кchrertвопросОбщие классы с коллекционным геттером других типов, Если вы можете придумать лучшее название для моего вопроса, не стесняйтесь редактировать его:
Следующий код содержит универсальный классGenericClass<T>
с методом возвращаемого типаT
и другой метод с типом возвратаCollection<String>
который, очевидно, не зависит отT
.
Теперь, если я создаю сырьеGenericClass
(что я бы никогда не сделал, так что этот вопрос - скорее теоретический вопрос, чтобы помочь понять, что происходит), тогда вызов этого метода в расширенном цикле for не будет работать, потому что вся информация об универсальных типах, похоже, теряется при использовании необработанных типов , Но затем, при вызове того же метода в присваивании, он работает (предупреждает о небезопасном типе, но компилирует).
На мой взгляд, либо оба не должны работать, либо оба должны работать. Я не понимаю, почему один работает, а другой нет. У вас есть какие-либо подсказки или вы знаете какие-либо части JLS, которые объясняют это поведение?
public class GenericClass<T> {
T doSomething() {
return null;
}
Collection<String> getCollection() {
return Collections.emptyList();
}
public static void main(String[] args) {
GenericClass raw = new GenericClass();
// This will not compile (Error message below)
for (String str : raw.getCollection()) {
// Type mismatch: cannot convert from element type Object to String
}
// This is only a warning:
// Type safety: The expression of type Collection needs unchecked conversion to conform to Collection<String>
Collection<String> coll = raw.getCollection();
for (String string : coll) {
// works just fine
}
}
}
Есть связанный вопрос, который вместе с принятым ответом объясняет, что происходит довольно хорошо:Почему этот общий код Java не скомпилируется?