>  기사  >  Java  >  Java 유형 삭제가 실제로 모든 정보를 완전히 지울 수 있습니까?

Java 유형 삭제가 실제로 모든 정보를 완전히 지울 수 있습니까?

angryTom
angryTom앞으로
2019-11-28 16:20:172030검색

Java 유형 삭제가 실제로 모든 정보를 완전히 지울 수 있습니까?

배경: 제네릭은 기본적으로 유형의 "유형 매개변수"를 제공한다는 것을 모두 알고 있습니다. 이를 매개변수화된 유형 또는 매개변수 다형성이라고도 합니다. 사실 제네릭이라는 개념은 자바에서 처음 소개된 것은 아닙니다. C++의 템플릿은 제네릭을 사용하는 예입니다.

(추천 동영상: java 동영상 튜토리얼)

GJ(Generic Java)는 Java 언어의 확장이며 매개변수화된 유형을 갖춘 Java 언어입니다. GJ로 작성된 프로그램은 매개변수화된 유형이 더 많고 유형 변환이 더 적다는 점을 제외하면 기본적으로 일반 Java 프로그램과 동일해 보입니다. 실제로 이러한 GJ 프로그램은 먼저 제네릭 없이 일반 Java 프로그램으로 변환된 다음 컴파일러가 자동으로 일반 Java에서 일반 Java로 변환을 완료합니다.

类型擦除真的能完全擦除一切信息吗?java 泛型揭秘

실제 Java 제네릭이란 무엇입니까

우리 모두는 컴파일러가 제네릭 삭제를 수행하고 컴파일러가 소스 프로그램을 컴파일할 때 제네릭을 사용할 수 있다는 것을 알고 있습니다(제네릭이 포함된 Java 코드) 유형 정보는 유형 안전성을 보장하고 제네릭 없이는 확인되지 않는 많은 유형 안전 제약 조건을 제거하고 생성된 바이트코드에서 이러한 유형 정보를 지웁니다. 먼저 확인해 보겠습니다.

public static void main(String[] args) {
 ArrayList<Integer> ints = new ArrayList<Integer>();
 ints.add(1); 
 ints.add(2);
 ints.add(3);
 ArrayList<String> sts = new ArrayList<String>();
 sts.add("a");
 sts.add("b");
 sts.add("c");
 System.out.println(ints.getClass() == sts.getClass()); 
}

위에 인쇄된 결과는

저희가 파악한 바에 따르면 일반 삭제 후에는 원본 유형을 모두 검색할 수 없습니다. 이것이 사실인가요? ?

다음 코드를 살펴보세요.

import java.lang.reflect.ParameterizedType;import java.util.ArrayList;import java.util.List;public class ClassTest {     
public static void main(String[] args) throws Exception {
     ParameterizedType type = (ParameterizedType) 
     Bar.class.getGenericSuperclass();
     System.out.println(type.getActualTypeArguments()[0]);
     
     ParameterizedType fieldType = (ParameterizedType) 
     Foo.class.getField("children").getGenericType();
     System.out.println(fieldType.getActualTypeArguments()[0]);
     
     ParameterizedType paramType = (ParameterizedType) 
     Foo.class.getMethod("foo", List.class)
     .getGenericParameterTypes()[0];
     System.out.println(paramType.getActualTypeArguments()[0]);
     
     System.out.println(Foo.class.getTypeParameters()[0]
     .getBounds()[0]);
     }     
     class Foo<E extends CharSequence> {     
     public List<Bar> children = new ArrayList<Bar>();     
     public List<StringBuilder> foo(List<String> foo) {return null; }     
     public void bar(List<? extends String> param) {}
     }     
     class Bar extends Foo<String> {}
    }

인쇄

class java.lang.Stringclass com.javapuzzle.davidwang456.ClassTest$Barclass java.lang.Stringinterface java.lang.CharSequence

각 유형 매개변수가 유지되고 런타임 시 리플렉션 메커니즘을 통해 얻을 수 있다는 것을 알 수 있습니다. 그렇다면 "유형 삭제"란 정확히 무엇입니까? 적어도 뭔가는 지워졌죠? 예. 실제로 구조화된 정보를 제외한 모든 정보는 삭제됩니다. 여기서 구조화된 정보는 프로그램 실행의 흐름보다는 클래스의 구조와 관련된 정보를 의미합니다. 즉, 클래스, 해당 필드 및 해당 메서드의 형식 매개 변수와 관련된 메타데이터가 유지되며 리플렉션을 통해 얻을 수 있습니다.

이 기사는 PHP 중국어 웹사이트, java tutorial 칼럼에서 가져온 것입니다. 환영합니다!

위 내용은 Java 유형 삭제가 실제로 모든 정보를 완전히 지울 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제