Explanation of “ClassCastException” in Java
This commit is contained in:
parent
b63aad5048
commit
4c748f7a23
|
@ -0,0 +1,97 @@
|
|||
package com.baeldung.exceptions.classcastexception;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
checkedCasts();
|
||||
uncheckedConversion();
|
||||
genericConversion();
|
||||
}
|
||||
|
||||
private static void checkedCasts() {
|
||||
|
||||
Animal animal = new Frog();
|
||||
|
||||
try {
|
||||
Mammal mammal = (Mammal) animal;
|
||||
} catch (ClassCastException e) {
|
||||
System.out.println("A checked downcast to Mammal is incompatible from Frog because Frog is not a subtype of Mammal.");
|
||||
}
|
||||
|
||||
try {
|
||||
Serializable serial = (Serializable) animal;
|
||||
} catch (ClassCastException e) {
|
||||
System.out.println("A checked cast to Serializable is incompatible from Frog because Frog is not a subtype of Serializable.");
|
||||
}
|
||||
|
||||
Object primitives = new int[1];
|
||||
|
||||
try {
|
||||
Integer[] integers = (Integer[]) primitives;
|
||||
} catch (ClassCastException e) {
|
||||
System.out.println("A checked cast to Integer[] is incompatible from primitive arrays. Auto-boxing does not work for arrays.");
|
||||
}
|
||||
|
||||
try {
|
||||
long[] longs = (long[]) primitives;
|
||||
} catch (ClassCastException e) {
|
||||
System.out.println("A checked cast to long[] is incompatible from int[]. Type promotion does not work for arrays.");
|
||||
}
|
||||
}
|
||||
|
||||
private static void uncheckedConversion() {
|
||||
Box<Long> originalBox = new Box<>();
|
||||
Box raw = originalBox;
|
||||
raw.setContent(2.5);
|
||||
Box<Long> bound = (Box<Long>) raw;
|
||||
try {
|
||||
Long content = bound.getContent();
|
||||
} catch (ClassCastException e) {
|
||||
System.out.println("An incompatible element was found in the raw box.");
|
||||
}
|
||||
}
|
||||
|
||||
private static void genericConversion() {
|
||||
try {
|
||||
String shouldBeNull = convertInstanceOfObject(123);
|
||||
} catch (ClassCastException e) {
|
||||
System.out.println("Should have been null, but due to type erasure, inside convertInstanceOfObject, " +
|
||||
"it will attempt to cast to Object instead of String, so it casts to Object, which is always possible.");
|
||||
}
|
||||
}
|
||||
|
||||
public static <T> T convertInstanceOfObject(Object o) {
|
||||
try {
|
||||
return (T) o;
|
||||
} catch (ClassCastException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public interface Animal {
|
||||
}
|
||||
|
||||
public static class Reptile implements Animal {
|
||||
}
|
||||
|
||||
public static class Frog extends Reptile {
|
||||
}
|
||||
|
||||
public static class Mammal implements Animal {
|
||||
}
|
||||
|
||||
public static class Box<T> {
|
||||
private T content;
|
||||
|
||||
public T getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
public void setContent(T content) {
|
||||
this.content = content;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue