Fix review suggestions.

This commit is contained in:
Cristian Stancalau 2020-10-14 18:22:32 +03:00
parent 6a82d1cde6
commit af0db9610e
9 changed files with 125 additions and 94 deletions

View File

@ -0,0 +1,6 @@
package com.baeldung.exceptions.classcastexception;
public interface Animal {
String getName();
}

View File

@ -0,0 +1,14 @@
package com.baeldung.exceptions.classcastexception;
public class Box<T> {
private T content;
public T getContent() {
return content;
}
public void setContent(T content) {
this.content = content;
}
}

View File

@ -0,0 +1,9 @@
package com.baeldung.exceptions.classcastexception;
public class Frog extends Reptile {
@Override
public String getName() {
return super.getName() + ": Frog";
}
}

View File

@ -1,94 +0,0 @@
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;
}
}
}

View File

@ -0,0 +1,9 @@
package com.baeldung.exceptions.classcastexception;
public class Mammal implements Animal {
@Override
public String getName() {
return "Mammal";
}
}

View File

@ -0,0 +1,9 @@
package com.baeldung.exceptions.classcastexception;
public class Reptile implements Animal {
@Override
public String getName() {
return "Reptile";
}
}

View File

@ -0,0 +1,40 @@
package com.baeldung.exceptions.classcastexception;
import org.junit.Test;
import java.io.Serializable;
public class CheckedCastsUnitTest {
@Test(expected = ClassCastException.class)
public void givenBaseTypeVariableReferencingChildInstance_whenCastToIncompatibleSubtype_thenClassCastException() {
Animal animal = new Frog();
//A checked downcast to Mammal is incompatible from Frog because Frog is not a subtype of Mammal.
Mammal mammal = (Mammal) animal;
}
@Test(expected = ClassCastException.class)
public void givenBaseTypeVariableReferencingChildInstance_whenCastToIncompatibleInterface_thenClassCastException() {
Animal animal = new Frog();
//A checked cast to Serializable is incompatible from Frog because Frog is not a subtype of Serializable.
Serializable serial = (Serializable) animal;
}
@Test(expected = ClassCastException.class)
public void givenObjectVariableReferencingPrimitiveArray_whenCastToBoxedTypeArray_thenClassCastException() {
Object primitives = new int[1];
//A checked cast to Integer[] is incompatible from primitive arrays. Auto-boxing does not work for arrays.
Integer[] integers = (Integer[]) primitives;
}
@Test(expected = ClassCastException.class)
public void givenObjectVariableReferencingPrimitiveArray_whenCastToPromotedTypeArray_thenClassCastException() {
Object primitives = new int[1];
//A checked cast to long[] is incompatible from int[]. Type promotion does not work for arrays.
long[] longs = (long[]) primitives;
}
}

View File

@ -0,0 +1,21 @@
package com.baeldung.exceptions.classcastexception;
import org.junit.Test;
public class GenericConversionUnitTest {
@Test(expected = ClassCastException.class)
public void givenIncompatibleType_whenConvertInstanceOfObject_thenClassCastException() {
// 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.
String shouldBeNull = convertInstanceOfObject(123);
}
public static <T> T convertInstanceOfObject(Object o) {
try {
return (T) o; // Casts to Object due to type erasure
} catch (ClassCastException e) {
return null; // Will never reach this
}
}
}

View File

@ -0,0 +1,17 @@
package com.baeldung.exceptions.classcastexception;
import org.junit.Test;
public class UncheckedConversionUnitTest {
@Test(expected = ClassCastException.class)
public void givenPollutedGenericType_whenGetProperty_thenClassCastException() {
Box<Long> originalBox = new Box<>();
Box raw = originalBox;
raw.setContent(2.5);
Box<Long> bound = (Box<Long>) raw;
//An incompatible element was found in the raw box.
Long content = bound.getContent();
}
}