Generics
generics: 型引数は実行時に消去される
ArrayList<String>とArrayList<Integer>はコンパイル時には別の型ですが、実行時クラスは同じです。
SourceTypeErasure.java
Java 21
package examples.generics;
import java.util.ArrayList;
import java.util.List;
public final class TypeErasure {
private TypeErasure() {}
public static boolean listsWithDifferentTypeArgumentsShareRuntimeClass() {
List<String> words = new ArrayList<>();
List<Integer> numbers = new ArrayList<>();
return words.getClass() == numbers.getClass();
}
}TestTypeErasureTest.java
Java 21
package examples.generics;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
class TypeErasureTest {
@Test
void 異なる型引数のArrayListは実行時には同じクラスである() {
assertTrue(TypeErasure.listsWithDifferentTypeArgumentsShareRuntimeClass());
}
}01Assertion
このテストで確認できること
- ArrayList<String>とArrayList<Integer>を作る
- 両者のgetClassは同じClassを返す
ジェネリクスの型安全性は主にコンパイル時の仕組みです。実行時の型判定やリフレクションでは型消去の制約を前提に設計します。
OBSERVED RESULT
expected: ArrayList<String>.class == ArrayList<Integer>.class → true
actual: true