이 글은 주로 자바 제네릭 관련 지식을 소개합니다. 매우 좋은 참조 값을 가지고 있습니다.
먼저 다음 코드를 살펴보겠습니다.
public class generictype { public static void main(String str[]) { Hashtable h =new Hashtable(); h.put(1, "String类型"); int a = (String) h.get(1); System.out.println(a); } } //执行结果 String类型 //如果我们将上述由红色标出的String改为int执行后结果如下(更改后编译没有错误): Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer at genetictype.generictype.main(generic1.java:10)
위는 를 강제한 전형적인 예입니다. 유형 변환은 오류를 일으킬 수 있지만 이 오류는 컴파일 중에 알 수 없으므로 런타임 중 jvm 확인 후 유형 변환 예외가 발생합니다.
다음 코드를 보세요.
public class generictype { public static void main(String str[]) { Hashtable<Integer, String> h = new Hashtable<Integer, String>(); h.put(1, "String类型"); String a= h.get(1); System.out.println(a); } } //执行结果 string类型 //需要提出的是1.上述由红色标出的String如果改为int,在编译的时候会报错 2.在h.get(1)前面不需要再进行强制类型转换。
요약하면 제네릭의 역할은 다음과 같습니다.
1. 컴파일 중에 확인됩니다. (Java에서 강제 유형 변환으로 인해 발생할 수 있는 오류 해결)은 컴파일러에 큰 임무를 부여했습니다.
2. 코드 재사용률 향상
유형 삭제:
유형 삭제는 컴파일러가 .java 파일을 컴파일할 때 클래스가 일반 매개변수가 제거되면 jvm이 바이트코드 파일을 로드할 때 일반이 표시되지 않습니다. 이 프로세스를 유형 삭제라고 합니다.
타입 삭제 관련 현상:
(1) 제네릭 클래스에는 Class라는 클래스 타입이 없습니다. 예를 들어, List
(2) 정적 변수는 일반 클래스의 모든 인스턴스에서 공유됩니다.
public class generictype { public static void main(String str[]){ test1<String> t = new test1<String>(); test1<Date> tt = new test1<Date>(); System.out.println(t.a); System.out.println(tt.a); } } class test1<T>{ static int a = 1; } //结果 1
(3) 예외 처리는 jvm에 의해 구현되고 jvm이 바이트코드를 로드하기 때문에 일반 유형 매개변수 오류는 예외 처리를 통과할 수 없습니다. 파일은 일반 기능을 삭제했으며 이는 또한 제네릭의 의미를 간접적으로 보여줍니다. 컴파일 중에 매개변수 유형 오류가 발견되었습니다.
유형 삭제의 기본 프로세스도 비교적 간단합니다.
1. 유형 매개변수를 일반적으로 Object인 최상위 상위 클래스로 바꿉니다. , 유형 매개변수의 상한이 지정된 경우 이 상한이 사용됩니다.
2. 나타나는 유형 선언을 제거합니다. 즉, a8093152e673feb7aba1828c43532094의 내용을 제거합니다.
예: T get() 메소드 선언은 Object get()이 됩니다. Listf7e83be87db5cd2d9a8a0b8117b38cd4 다음으로 몇 가지 브리지 메서드를 생성해야 할 수도 있습니다. 이는 유형을 지운 후의 클래스에 필요한 일부 메소드가 부족할 수 있기 때문입니다. 예를 들어 다음 코드를 생각해 보세요.
public class generictype {public static void main(String str[]) { test3 t =new test3(); t.getT("11111"); } } interface test2<T>{ public T getT(T t); } class test3 implements test2<String>{ public String getT(String t){ return t; } } //类型擦除后的代码 public class generictype { public static void main(String str[]) { test3 t = new test3(); t.getT("11111"); } interface test2 { public Object getT(Object t); } class test3 implements test2 { public String getT(String T){ return T } public Object getT(Object t) { return this.getT((String) t); }//如果没有这段代码,在类型擦除后test3没有重写接口test2的抽象方法,明显错误,因此编译器的巨大作用就是在这里帮忙生成了该方法,同时编译器也依靠该功能完成检错任务。 }
제네릭 분류: 제네릭 클래스, 제네릭 인터페이스, 제네릭 메서드, 제네릭 예외
제네릭 클래스
public class generictype { public static void main(String str[]) { test<Integer, String> t = new test<Integer, String>(); t.put(1, "str1"); t.put(2, "str2"); System.out.println(t.get(1)); System.out.println(t.get(2)); } } class test<T, V> { public Hashtable<T, V> h = new Hashtable<T, V>(); public void put(T t, V v) { h.put(t, v); } public V get(T t) { return h.get(t); } } //执行结果 str1 str2
다형성 방법(일반 방법): 함수 이름 앞에 제네릭을 정의합니다. 매개변수 목록, 반환 값 유형 및 메서드 본문 🎜>public class generictype {
public <T> String getString(T obj){
return obj.toString();
}
public static void main(String str[]) {
generictype g =new generictype ();//不需要类的泛型
System.out.println(g.getString(1));
System.out.println(g.getString('a'));
System.out.println(g.getString("a"));
}
}
//执行结果
a
a
.
위 내용은 Java Generics의 샘플 코드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!