Item 26. Raw Type
Raw Typeμ μ¬μ©νμ§ λ§λΌ
μ λ€λ¦ νμ
μ μ μνκ² λλ©΄ λ§€κ°λ³μ νμ
μ΄ μ μλμ§ μμ Raw Typeμ΄λΌλ κ²μ΄ μκΈ°κ² λλ€.(List<E>
-> List
)
μ΄λ¬ν Raw Typeμ μλμ κ°μ΄ κ·Έλ₯ μ¬μ©νκ² λλ©΄ μ»΄νμΌλ¬λ κ²½κ³ λ₯Ό λμ°κ² λλ€.(κ·Έλ§νΌ μνν μν° ν¨ν΄)
class Main {
public static void main(String[] args) {
List list = new ArrayList(); // Raw use of parameterized class 'List'
list.add("Hello"); // Unchecked call to 'add(E)' as a member of raw type 'java.util.List'
Object o = list.get(0);// μ»΄νμΌλ¬ κ²½κ³
System.out.println(o);
Integer i = (Integer) o; // μ»΄νμΌ μ±κ³΅, λ°νμ μλ¬
System.out.println(i);
}
}
νμ§λ§ μμ νμ λ³νμ μλνμ¬ ν λΉνλ €κ³ νλ κ²½μ°μ μ»΄νμΌμ μ±κ³΅νκ³ , λ°νμ μλ¬κ° λ°μνλ μ¬κ°ν λ¬Έμ κ° λ°μνλ€. ν΄κ²° λ°©λ²μ κ°λ¨νκ²λ μ λ€λ¦ νμ μ μ¬μ©νμ¬ μ»΄νμΌλ¬μκ² νμ μ κ°μ νλλ‘ νλ©΄ λλ€.
class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Hello");
String s = list.get(0);
System.out.println(s);
Integer i = (Integer) s; // μ»΄νμΌ μλ¬
}
}
μ΄μ²λΌ Raw Typeμ μ λ€λ¦ νμ μ μ¬μ©νμ§ μκ³ μ¬μ©νκ² λλ©΄ μμ±ν μ μλλ°, μ λ μ¨μλ μ λλ νμ μ΄λ€. νμ§λ§ μ»΄νμΌλ¬ μμμ Raw Typeμ νμ©νλ μ΄μ λ μ λ€λ¦ νμ μ΄ λμ λκΈ° μ μ μ¬μ©νλ μ½λμμ νΈνμ±μ μν΄ λμ λ κ²μ΄λ μ¬μ©νμ§ μλ κ²μ΄ μ’λ€.
List
vs List<Object>
List
vs List<Object>
Objectλ λͺ¨λ ν΄λμ€μ μ΅μμ ν΄λμ€μ΄κΈ° λλ¬Έμ List
κ°μ Raw Typeκ³Ό λμΌνκ² λμνλ€κ³ μκ°ν μ μμ§λ§, μ€μ λ‘λ μ°¨μ΄κ° μλ€.
List
: νμ μ μμ ν 체ν¬νμ§ μμList<Object>
: λͺ¨λ νμ μ νμ©νλ€λ μμ¬λ₯Ό λͺ νν μ μ, νμ μ 체ν¬
μλ μμ μ½λλ₯Ό 보면 List
λ List<String>
μ λ겨 λ°μ μ μμ§λ§, List<Object>
λ List<String>
μ λ겨 λ°μ μ μλ€.
μ΄λ μ λ€λ¦ νμ νμ
κ·μΉμ μν΄ List<String>
μ List<Object>
μ νμ νμ
μ΄ μλκΈ° λλ¬Έμ΄λ€.
// List
class Main1 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
unsafeAdd(list, Integer.valueOf(42));
String s = list.get(0); // λ°νμ μλ¬, Exception in thread "main" java.lang.ClassCastException
}
private static void unsafeAdd(List list, Object o) {
list.add(o);
}
}
// List<Object>
class Main2 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
unsafeAdd(list, Integer.valueOf(42)); // μ»΄νμΌ μλ¬, Required type: List<Object> Provided: List<String>
}
private static void unsafeAdd(List<Object> list, Object o) {
list.add(o);
}
}
Wildcard Type(μμΌλμΉ΄λ νμ
)
Raw Typeμ μ¬μ©νλ©΄ λͺ¨λ νμ
μ νμ©ν μ μμ§λ§, μ΄λ μνν λ°©λ²μ΄λ€.
List<Object>
κ°μ΄ μ¬μ©νλ κ²μ μ λ€λ¦ νμ νμ
κ·μΉμ μν΄ List<String>
μ λ겨 λ°μ μ μκΈ° λλ¬Έμ λͺ¨λ νμ
μ νμ©νλ λ°©λ²μ΄ μλλ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ ?
λ₯Ό μ¬μ©ν μμΌλμΉ΄λ νμ
μ μ¬μ©νλ©΄ λλ€.
class Main2 {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
unsafeAddWildcard(list1, list2);
unsafeAddRaw(list1, list2);
}
private static void unsafeAddWildcard(List<?> list1, List<?> list2) {
list1.add(list2.get(0)); // incompatible types: java.lang.Object cannot be converted to capture#1 of ?
}
private static void unsafeAddRaw(List list1, List list2) {
list1.add(list2.get(0));
}
}
Raw Typeμ νμ 체ν¬λ₯Ό μ ν νκ³ μμ§ μμ, μ μ νμ§ μμ νμ μ λ겨 λ°μλ μ»΄νμΌ μλ¬κ° λ°μνμ§ μλλ€. νμ§λ§ μμΌλμΉ΄λ νμ μ νμ 체ν¬λ₯Ό νκ³ μκΈ° λλ¬Έμ λ°νμ μλ¬λ₯Ό λ°©μ§ν μ μλ€.
Raw Typeμ μ¬μ©νλ κ²½μ°
Raw Typeμ μ§μ μ μΌλ‘ μ¬μ©νλ κ²½μ°λ μμ΄μλ μλμ§λ§ μλμ κ°μ κ²½μ°μλ Raw Typeμ μ¬μ©ν΄μΌνλ€.
class 리ν°λ΄:
List.class
,String[].class
,int.class
λ νμ©λμ§λ§List<String>.class
λ νμ©λμ§ μμinstanceof μ°μ°μ:
instanceof List<String>
μ νμ©λμ§ μμλ°νμμλ μ λ€λ¦ νμ μ λ³΄κ° μ§μμ§κΈ° λλ¬Έμ μ¬μ©ν μ μμ
Last updated
Was this helpful?