> Java > java지도 시간 > Java Generics의 샘플 코드에 대한 자세한 설명

Java Generics의 샘플 코드에 대한 자세한 설명

黄舟
풀어 주다: 2017-03-21 10:19:49
원래의
1666명이 탐색했습니다.

이 글은 주로 자바 제네릭 관련 지식을 소개합니다. 매우 좋은 참조 값을 가지고 있습니다.

먼저 다음 코드를 살펴보겠습니다.

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.class 또는 List.class는 없고 List.class만 있습니다.

(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. 나타나는 유형 선언을 제거합니다. 즉, <>의 내용을 제거합니다.

예: T get() 메소드 선언은 Object get()이 됩니다. List 다음으로 몇 가지 브리지 메서드를 생성해야 할 수도 있습니다. 이는 유형을 지운 후의 클래스에 필요한 일부 메소드가 부족할 수 있기 때문입니다. 예를 들어 다음 코드를 생각해 보세요.

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
로그인 후 복사

다형성 방법(일반 방법): 함수 이름 앞에 제네릭을 정의합니다. 매개변수 목록, 반환 값 유형 및 메서드 본문 🎜>

.

위 내용은 Java Generics의 샘플 코드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿