Явное приведение Java к list.get (0) (несовместимые типы: java.lang.Object нельзя преобразовать в java.lang.String) - PullRequest
0 голосов
/ 08 октября 2019

Следующий код упоминается в Учебниках Java: - (https://docs.oracle.com/javase/tutorial/java/generics/why.html)

List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0);

Приведение в последней строке предполагает, что list.get (0) не возвращает строку. Теперь, так какlist не был объявлен ни с каким типом данных, он может принимать любой объект. Поэтому я предположил, что list.get (0) возвращает тип Object.

Но когда я проверяю list.get(0) instanceof String ->, он возвращает true.

Почему тогда требуется явное приведение. Пожалуйста, объясните.

Ответы [ 3 ]

2 голосов
/ 08 октября 2019

Итак, я предположил, что list.get (0) возвращает тип объекта.

Да, это так.

Но когда я проверяю list.get(0) instanceof String -> возвращает true.

Да, он должен возвращать true , поскольку элемент с индексом 0 из list a String.

Почему тогда требуется явное приведение.

требуется просто потому, что список содержит Object с, а не каждый Object из списка гарантированно будет String. Требуется явное приведение, чтобы можно было присвоить ссылку от list.get(0) до s (переменная типа String).

1 голос
/ 08 октября 2019

Приведение в последней строке предполагает, что list.get (0) не возвращает строку.

Это неточно. Если возвращенный объект не был a String, тогда приведение не было бы возможным. Другими словами, вы можете привести что-то к String, только если это что-то String. Попробуйте привести что-то еще, вы увидите:

Object i = Integer.valueOf(5);
String j = (String)i; //Exception!

Приведение необходимо в вашем коде, потому что list.get(0) возвращает тип Object, но мы хотим присвоить его String s. Мы, как программисты, знаем, что Object, возвращаемый из списка, на самом деле String, а компилятор - нет. Компилятор просто видит это:

Object l = list.get(0);
String s = l;

Вторая строка не может быть скомпилирована без явного приведения к String.

И просто для пояснения ... вы никогда не увидите такой код вреальный мир, если вы не работаете над чем-то серьезно старым. Java имеет дженерики начиная с Java 5 (2004), и вот уже 15 лет. На данный момент вы действительно не должны видеть List без этого List<SomeType> (например, List<String>)

0 голосов
/ 08 октября 2019

List list = new ArrayList(); - это непараметризованный тип (которого вы хотите избежать), то есть он может принимать любой Object.

, поскольку ваш list содержит любые Object s, list.get(0); можеттолько знаю, что он возвращает Object и не знает, что элемент в 0 на самом деле String. Поскольку не знает , что это действительно String, компилятор предупреждает вас, что вы выполняете непроверенное приведение от Object до String.

list.get(0) instanceof String возвращает true, поскольку во время выполнения проверяется, что элемент в 0 на самом деле является String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...