Есть похожие вопросы, но я не нашел ни одного, который действительно отвечал бы моим проблемам или охватывал бы мою реальную реализацию.
со следующим примером кода (который отражает мою реальную ситуацию)
public class MainTest {
public static void main(String[] args) {
WhateverDtoXmlParser parser = (new MainTest()).new WhateverDtoXmlParser();
// I want to do this (having to do suppressWarnings)
WhateverDto wd = parser.getDto();
// Instead of (usage without the warning).
// I want to avoid all of this!
Dto d = parser.getDto();
WhateverDto wd2 = null;
if (d instanceof WhateverDto) { // All of this is stupid and unnecessary IMO.
wd2 = (WhateverDto) d;
}
}
abstract class AbstractDtoXmlParser {
public abstract <T extends Dto> T getDto();
}
class WhateverDtoXmlParser extends AbstractDtoXmlParser {
@SuppressWarnings("unchecked")
@Override
public WhateverDto getDto() { // instead of public Dto getDto() (to avoid instanceof + cast)
return new WhateverDto();
}
}
abstract class Dto {
// ...
}
public class WhateverDto extends Dto {
// ...
}
}
Считаете ли вы это правильным использованием, хотя я использовал подавление предупреждений?
Я имею в виду, что я ЗНАЮ возвращаемый тип из WhateverDtoXmlParser
будет WhateverDto
, а не просто любым другим Dto, потому что я кодировал его таким образом . Почему Java не может проверить, если возвращаемый тип extends Dto
, как я явно указал его с помощью <T extends Dto
> (плюс он расширяет абстрактный класс ...), и принять его?
Либо я делаю это там, либо я должен использовать instanceof
s и приводить каждый раз, когда использую getDto()
..! Мне кажется, что моя текущая реализация «лучшая», но тогда почему я получаю такое важное предупреждение?
После прочтения других тем кажется, что нет способа обойти это предупреждение, но стоит ли мне продолжать мою текущую реализацию?