>  기사  >  Java  >  Java의 제네릭을 함께 이해해 봅시다

Java의 제네릭을 함께 이해해 봅시다

WBOY
WBOY앞으로
2022-05-18 17:06:462067검색

이 글은 사용자 정의 제네릭 클래스, 사용자 정의 제네릭 메서드, 사용자 정의 제네릭 인터페이스 등 제네릭과 관련된 문제를 주로 소개하는 java에 대한 관련 지식을 제공합니다. 함께 살펴보도록 하겠습니다. 도움이 되기를 바랍니다. 모두에게.

Java의 제네릭을 함께 이해해 봅시다

추천 학습: "java 비디오 튜토리얼"

  • Generics:은 JDK5에 도입된 기능으로, 컴파일 단계에서 작업의 데이터 유형을 제한하고 확인할 수 있습니다.
  • 제네릭 형식: <데이터 유형>, 참고: 제네릭은 참조 데이터 유형만 지원할 수 있습니다.
  • 컬렉션 시스템의 모든 인터페이스와 구현 클래스는 제네릭 사용을 지원합니다.

장점:

  • 통합 데이터 유형.
  • 컴파일 단계에서 유형이 결정될 수 있으므로 강제 유형 변환으로 발생할 수 있는 문제를 방지하여 실행 문제를 컴파일 기간까지 미리 진행하세요.
public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("石原里美");
        list.add("工藤静香");
        list.add("朱茵");
        for (String s : list) {
            System.out.println(s);
        }
    }
输出结果:
石原里美
工藤静香
朱茵

그리고 제네릭은 클래스 뒤의 제네릭 클래스, 메서드 선언 뒤의 제네릭 메서드, 인터페이스 뒤의 제네릭 인터페이스 등 여러 위치에서 정의될 수 있습니다. 다음으로 이러한 제네릭을 함께 사용하는 방법을 알아보겠습니다.

Custom 제네릭 클래스

Concept

  • 제네릭을 동시에 정의하는 클래스가 제네릭 클래스입니다.
  • 일반 클래스 형식: 수정자 클래스 클래스 이름 <일반 변수> {     }
public class MyArrayList<E>{    }
  • 기능: 집합의 역할과 유사하게 데이터 유형을 컴파일 단계에서 지정할 수 있습니다.

실용 교육

이제 사용법을 자세히 이해하기 위해 기본 추가 및 삭제 작업을 구현하는 일반 클래스를 만듭니다.

//泛型类MyArrayLIst
public class MyArrayLIst<E> {
    public void add(E e){

    }
    public void remove(E e){

    }
}
//main
public static void main(String[] args) {
        MyArrayLIst<String> list = new MyArrayLIst<>();
        //通过对泛型的设定,实现对数据专一处理
        list.add("石原里美");
        list.add("工藤静香");
        list.remove("工藤静香");
    }

일반 클래스의 원칙:

일반 변수가 나타나는 모든 위치를 전송된 실제 변수로 바꿉니다. 데이터 유형 .

주의깊게 관찰해 보면 제네릭 클래스와 일반 클래스의 가장 큰 차이점은 메소드 호출 시 동일한 데이터를 균일하게 처리할 수 있고 다른 데이터 유형이 어느 정도 문제를 방지한다는 점을 발견하는 것은 어렵지 않습니다. 유형 변환을 강제할 때 발생할 수 있는 문제입니다.

Custom 제네릭 메서드

개념

  • 제네릭 메서드를 동시에 정의하는 메서드가 제네릭 메서드입니다.
  • 일반 메소드의 형식: 수식어 <일반 변수> 반환 값 유형 메소드 이름(공식 매개변수 목록) { , 메소드가 더 다양해졌습니다.
참고:
    제네릭 메서드는 제네릭 클래스에 정의된 메서드와 구별되어야 합니다. 제네릭도 제네릭을 사용하지만 제네릭은 제네릭 클래스에 의해 정의되지 않습니다.
  • 실습 교육 어떤 유형의 배열을 전달하더라도 그 내용을 반환할 수 있습니다. 즉, Arrays.toString()의 함수가 구현됩니다.
public <E> void view(E e){    }
제네릭 메서드 정의, 여러 데이터 유형 구현 구현이 가능합니다. 수신 및 적용 범위가 더 넓어집니다.

사용자 정의 일반 인터페이스

개념

제네릭을 사용하여 정의된 인터페이스는 일반 인터페이스입니다.

일반 인터페이스 형식: 공용 인터페이스 People{   }
public static void main(String[] args) {
        String [] name = {"石原里美","工藤静香","朱茵"};
        view(name);
        Integer [] age = {18,19,20};
        view(age);
    }
    public static  <T> void view(T[] arr){
        StringBuilder list = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            list.append(arr[i]).append("\t");
        }
        System.out.println(list);
    }
  • Function: 일반 인터페이스를 사용하면 구현 클래스에서 현재 함수가 작동하는 데 필요한 데이터 유형을 선택할 수 있습니다
  • 실용 교육
    • People 인터페이스를 정의하고 Teacher 클래스, Student 클래스 등에 대한 작업을 구현합니다.
    public interface People <E>{    }
    위의 코드를 관찰하면 People 다음에 어떤 유형이 정의되어 있는지 알 수 있으며, 구현 클래스는 이 데이터 유형에만 작동할 수 있습니다. 이 작업에는 다른 유형이 허용되지 않습니다.

    通配符和上下限 

    通配符 

    • ?可以在“使用泛型”的时候代表一切类型
    • E T K V是在定义泛型的时候用的 

     假设现在有一场为学生和老师而举办的比赛,需要比较速度究竟谁更快,分别创建一定数量的对象并将其传入集合之中。然而当我们将这两个集合分别传入方法中的时候,会发现,学生对象集合list2出现报错,为什么呢?原因是因为数据类型不同,那么该如何使得两种类型都可以传入呢?或许这个时候就会有人说了:“既然两个类都是People的子类,那么为什么不定义它的泛型是People呢?”这个想法很好,但是我们需要明确一点的是子类与父类虽然是有关系的,但是定义之后的集合是没有关系的,所以这里是行不通的。

    //main
    //老师对象集合
    ArrayList<Teacher> list1 = new ArrayList<>();
    list1.add(new Teacher());
    list1.add(new Teacher());
    pk(list1);
    //学生对象集合
    ArrayList<Student> list2 = new ArrayList<>();
    list2.add(new student());
    list2.add(new student());
    pk(list2);//由于pk方法的形参是泛型为Teacher的集合,所以会报错
    //父类
    class People{
    
        }
    //子类
    class Teacher extends People{
    
        }
    class student extends People{
    
        }
    //pk方法:
    public static void pk(ArrayList<Teacher> people){
    }

    应对这个问题,我们可以便可以将本篇文章引入的知识“通配符”放在实际应用中解决问题了,通过其简短的概念“?可以在‘使用泛型’的时候代表一切类型”就可以理解其作用了,这里我们可以使用“?”共同代表两种类型。

    public static void pk(ArrayList<?> people){
    //通过通配符?便可以将这个问题解决掉
        }

     上下限 

    然而此时又出现一个问题,定义了一个dog类,试图创建一些对象并传入集合中混入比赛,这种当然情况当然是不允许发生的,然而?是可以表示任意类型的,并不能对其进行限制。因此上下限的作用就体现出来了:

    •  上限:,传入类型必须是该父类或者是父类的子类
    • 下限:,传入类型必须是该子类或者是子类的父类
    public static void pk(ArrayList<? extends People> people){
    //通过上下限便可以将这个问题解决掉
    //要求传入的类型必须是People的子类才可以
        }

    推荐学习:《java视频教程

    위 내용은 Java의 제네릭을 함께 이해해 봅시다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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