Проблема в том, что для компилятора Java важен статический тип объекта, а не то, что он есть во время выполнения.
Аналогично, следующий пример отклоняется компилятором Java:
SuperClass a = new SubClass1();
a.SomeMethodInSubClass1ButNotInBaseClass(); // fails
Если компилятор разрешил это, вы могли бы назначить что-то еще для a
, например:
SuperClass a = new SubClass1();
a = new SubClass2(); // it doesn't have the method!
a.SomeMethodInSubClass1ButNotInBaseClass(); // would fail at runtime if allowed
В общем случае теоретически невозможно найти точный тип переменной во время компиляции. Компилятор остается консервативным и просто не может скомпилировать вместо того, чтобы предполагать правильность и, возможно, потерпеть неудачу во время выполнения (динамические языки, такие как Python, обычно выбирают противоположное проектное решение: предполагают правильность и потенциально терпят неудачу во время выполнения).
Ваш фрагмент кода по существу демонстрирует то же самое, где тип возвращаемого значения dexListMod.get
метода, вероятно, Object
, и он возвращает экземпляр String
(который является производным от Object
).
Если вы уверены в типе объекта во время выполнения, Java требует, чтобы вы были откровенны в этом и взяли на себя ответственность вручную привести его к типу, который вы ожидаете. Конечно, приведение может привести к сбою во время выполнения и вызвать исключение.