ホームページ  >  記事  >  Java  >  Java のジェネリックスを一緒に理解しましょう

Java のジェネリックスを一緒に理解しましょう

WBOY
WBOY転載
2022-05-18 17:06:462067ブラウズ

この記事では、java に関する関連知識を提供し、主にカスタム ジェネリック クラス、カスタム ジェネリック メソッド、カスタム ジェネリック インターフェイスやその他の内容を含むジェネリックスに関連する問題を紹介します。みんなの役に立つでしょう。

Java のジェネリックスを一緒に理解しましょう

推奨される学習: 「java ビデオ チュートリアル

  • ジェネリック: は 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);
        }
    }
输出结果:
石原里美
工藤静香
朱茵

また、ジェネリックスは、クラスの後のジェネリック クラス、メソッド宣言の後のジェネリック メソッド、インターフェイスの後のジェネリック インターフェイスなど、さまざまな場所で定義できます。次に、これらのジェネリックを一緒に使用する方法を学びましょう:

カスタム ジェネリック クラス

Concept

  • 定義クラス ジェネリックを定義するクラス。 Same time はジェネリック クラスです。
  • ジェネリック クラスの形式: 修飾子クラス クラス名<ジェネリック変数> { }
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("工藤静香");
    }

ジェネリック クラスの原則:

出現するジェネリック変数をすべて、送信される実際のデータ型に置き換えます。

注意深く観察すると、ジェネリック クラスと通常のクラスの最大の違いは、メソッド呼び出し時に同じデータを均一に処理でき、他のデータ型が関与しないことであることがわかります。強制的な型変換中に発生する可能性のある問題はある程度回避されます。

カスタム ジェネリック メソッド

概念

  • メソッドの定義中にジェネリック メソッドを定義するメソッドは、ジェネリック メソッドです。
  • ジェネリックメソッドの形式: 修飾子 戻り値の型 メソッド名 (仮引数リスト) { }
public <E> void view(E e){    }
    #関数:ジェネリックスをメソッドで使用すると、実際のすべての型のパラメーターを受け取ることができるため、メソッドの汎用性が高まります。
  • 注: ジェネリック メソッドは、ジェネリック クラスで定義されたメソッドとは区別する必要があります。ジェネリック メソッドもジェネリックを使用していますが、ジェネリックはジェネリックによって定義されるのではなく、ジェネリックによって定義されます。クラス定義。
実践教育

どのような型の配列を渡してもその内容を返すことができる、つまり Arrays.toString() の機能が実現されます

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);
    }
合格 ジェネリックメソッドの定義を実装すると、複数のデータ型の受信が実現でき、応用範囲が広がります。

カスタム ジェネリック インターフェイス

コンセプト

    ジェネリックを使用して定義されたインターフェイスは、ジェネリック インターフェイスです。
  • #汎用インターフェイスの形式: パブリック インターフェイス People{ }
  • public interface People <E>{    }
  • 機能: 汎用インターフェイスにより、実装クラスは現在の関数が操作する必要があるデータ型
  • 実践的な教育
Teacher クラス、Student クラスなどで操作を実装するための People インターフェイスを定義します。

//People接口
public interface People <E>{
    void run(E e);
    void height(E e);
}
//Student类
public class Teacher {

}
//实现类Fantype
public class Fantype implements People<Teacher> {

    @Override
    public void run(Teacher teacher) {

    }

    @Override
    public void height(Teacher teacher) {

    }
}

Through上記のコードを観察すると、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。