Вопрос-ответ

Explanation of ClassCastException in Java

Объяснение ClassCastException в Java

Я прочитал несколько статей, написанных о "ClassCastException", но я не смог получить хорошего представления о том, что это значит. Что такое ClassCastException?

Переведено автоматически
Ответ 1

Прямо из спецификаций API для ClassCastException:


Выдается для указания того, что код попытался привести объект к подклассу, экземпляром которого он не является.


Итак, например, когда кто-то пытается привести Integer к a String, String не является подклассом Integer, поэтому будет выдан a ClassCastException.

Object i = Integer.valueOf(42);
String s = (String)i; // ClassCastException thrown here.
Ответ 2

На самом деле все довольно просто: если вы пытаетесь преобразовать объект класса A в объект класса B, и они несовместимы, вы получаете исключение приведения класса.

Давайте представим коллекцию классов.

class A {...}
class B extends A {...}
class C extends A {...}

  1. Вы можете привести любую из этих вещей к Object , потому что все классы Java наследуют от Object .

  2. Вы можете привести либо B, либо C к A, потому что они оба являются "разновидностями" A

  3. Вы можете привести ссылку на объект A к B, только если реальным объектом является a B.

  4. Вы не можете преобразовать B в C, даже если они оба являются A .

Ответ 3

Это исключение, которое возникает, если вы пытаетесь понизить класс, но на самом деле класс не этого типа.

Рассмотрим эту иерархию:


Объект -> Животное -> Собака


Возможно, у вас вызывается метод:

 public void manipulate(Object o) {
Dog d = (Dog) o;
}

Если вызывается с помощью этого кода:

 Animal a = new Animal();
manipulate(a);

Он будет компилироваться просто отлично, но во время выполнения вы получите ClassCastException потому что o на самом деле было животным, а не собакой.

В более поздних версиях Java вы получаете предупреждение компилятора, если не выполните:

 Dog d;
if(o instanceof Dog) {
d = (Dog) o;
} else {
//what you need to do if not
}
Ответ 4

Рассмотрим пример,

class Animal {
public void eat(String str) {
System.out.println("Eating for grass");
}
}

class Goat extends Animal {
public void eat(String str) {
System.out.println("blank");
}
}

class Another extends Goat{
public void eat(String str) {
System.out.println("another");
}
}

public class InheritanceSample {
public static void main(String[] args) {
Animal a = new Animal();
Another t5 = (Another) new Goat();
}
}

В Another t5 = (Another) new Goat(): вы получитеClassCastException, потому что вы не можете создать экземпляр Another класса с помощью Goat.

Примечание: Преобразование допустимо только в тех случаях, когда класс расширяет родительский класс, а дочерний класс приводится к его родительскому классу.

Как справиться с ClassCastException:


  1. Будьте осторожны при попытке привести объект одного класса к другому классу. Убедитесь, что новый тип принадлежит одному из его родительских классов.

  2. Вы можете предотвратить ClassCastException с помощью Generics, поскольку Generics обеспечивают проверки во время компиляции и могут использоваться для разработки типобезопасных приложений.

Источник примечания и остальное

java