Я совершенно новичок в Java Generics. Но я прочитал много кратких ссылок и примеров. Но я не могу понять самый простой способ. Надеюсь соменое может помочь:
Я хочу создать HashMap, который отображает один неопределенный объект на другой. Оба объекта могут быть одним из String или Integer.
Итак, я написал это:
private final HashMap<L, R> left2Right = new HashMap<L, R>();
Extractor<?> extLeft = Extractor.getInstance(0);
Extractor<?> extRight = Extractor.getInstance(1);
L leftVal = extLeft.extract(d, i);
R rightVal = extRight.extract(d, i);
this.left2Right.put(leftVal, rightVal);
Пока все хорошо ... Но у меня проблемы с реализацией объектов экстрактора. Они воплощены фабричным образцом. Я сделал это так (просто):
abstract class Extractor<E> {
abstract E extract(DTable source, int row);
static <E> Extractor<E> getInstance(int type) {
if(type == 0)
return new IntExtractor();
else
return new StringExtractor();
}
}
class IntExtractor extends Extractor<Integer> {
@Override
Integer extract(DTable source, int row) {
int value = 5;
return new Integer(value);
}
}
class StringExtractor extends Extractor<String> {
@Override
String extract(DTable source, int row) {
String retVal = "hello";
return retVal;
}
}
Он компилируется, но я получаю Unsave предупреждения при приведении Integer / String к E. Что я делаю не так? Я знаю, я могу просто подавить предупреждения. Но я думал, что именно это должно быть преимуществом дженериков Java? Я не могу сохранить этот бросок, потому что я не знаю, какой тип 'E' действительно "есть" ...
Или я что-то делаю в принципе неправильно?
Примечание:
Я изменил свой код для «нового» вопроса после того, как использовал некоторую информацию из первого ответа ...