Для моей страны (Вьетнам) getLocality
вернет ноль, а addresses.get(0).getAddressLine(0)
вернет район, а не город
Так что я буду делать так
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
int maxAddressLine = addresses.get(0).getMaxAddressLineIndex();
String countryName = addresses.get(0).getAddressLine(maxAddressLine);
String stateName = addresses.get(0).getAddressLine(maxAddressLine-1);
String cityName = addresses.get(0).getAddressLine(maxAddressLine-2);
if (obj.getClass().isInstance(Statement.class)) {
doStuffWithStatements((Statement) obj));
}
Самое приятное в этом техника (в отличие от ключевого слова instanceof) заключается в том, что вы можете передавать тестовый класс как объект. Но, да, в остальном он идентичен instanceof.
ПРИМЕЧАНИЕ: Я сознательно избегал редакционных статей о том, является ли проверка экземпляра типа правильным делом. Да, в большинстве случаев лучше использовать полиморфизм. Но ОП спросил не об этом, и я просто отвечаю на его вопрос.
Ответ на ваш вопрос - instanceof.
Однако, имейте в виду, что если вашему коду нужен instanceof, это признак того, что что-то не так с вашим дизайном. Бывают случаи, когда instanceof оправдан, но это скорее исключения. Обычно, если вашим подклассам нужно вести себя по-другому, вы должны использовать полиморфизм вместо if ().
if(object instanceof WhereStatement) {
WhereStatement where = (WhereStatement) object;
doSomething(where);
}
Обратите внимание, что такой код обычно означает, что в вашем базовом классе отсутствует полиморфный метод. т.е. doSomething ()
должен быть методом утверждения
, возможно абстрактным, который переопределяется подклассами.
Это не способ делать что-то объектно-ориентированным способом, это возврат к старой дихотомии код / данные. Это не обязательно плохо (если вы знаете, что делаете), но это следует оставить на усмотрение не объектно-ориентированных языков, таких как C.
При правильном проектировании вам не нужно такое поведение. Вместо конструкции:
if (obj.getClass().isInstance(Statement.class)) {
doStuffWithStatements((Statement) obj));
}
(извиняюсь перед Бенджисмитом за «кражу» его кода) вы действительно должны сделать сам объект ответственным за свои собственные действия следующим образом:
obj.doStuff();
Тогда каждый отдельный класс obj
будет есть собственное определение для doStuff
. Это правильный способ сделать это.