Javaの一般的な使用法(クラス、メソッド、インターフェースプロトコル、タイプワイルドカード、ワイルドカードの上限と下限)

1.はじめに

  • 泛型JDK5はで導入された機能で、コンパイル時に不正な型を検出できるコンパイル時の型安全性検出メカニズムを提供します。その本質はパラメータ化された型であり、操作されるデータ型がパラメータとして指定されることを意味します。

  • パラメータに関しては、最もよく知られているのは、正式なパラメータを使用してメソッドを定義し、メソッドを呼び出すときに実際のパラメータを渡すことです。では、パラメーター化された型をどのように理解しますか?名前が示すように、元の具象型で型をパラメータ化し、使用/呼び出し時に具象型を渡すことです。

  • このパラメータタイプは、クラス、メソッド、およびインターフェイスで使用できます。これらは、それぞれジェネリッククラス、ジェネリックメソッド、およびジェネリックインターフェイスと呼ばれます。

  • 泛型定義形式:

    • <类型>:型の形式を指定します。ここで、型は正式なパラメーターと見なすことができます。

    • <类型1,类型2...>:複数のタイプの形式を指定し、複数のタイプをコンマで区切ります。ここでのタイプは、正式なパラメーターと見なすことができます。

    • 将来的には、特定の呼び出しで指定された型は実際のパラメーターと見なすことができ、実際のパラメーターの型は参照データ型のみにすることができます。

  • 泛型の利点:

    • 実行時の問題をコンパイル時に移動しました

    • キャストを避ける

2.ジェネリッククラス

  • 泛型类の定義形式:

    • フォーマット:修饰符 class 类名<类型> { }

    • 例:public class Generic<T> { }

    • ここでは、任意の識別子として記述Tでき、やなどの一般的なT、E、K、 Vパラメータは、ジェネリックを表すためによく使用されます。

  • パブリックジェネリッククラスを定義するGeneric.java

    public class Generic<T> {
      // 定义私有属性
      private T t;
      // 重写 get 方法
      public T getT() {
        return t;
      }
      // 重写 set 方法
      public void setT(T t) {
        this.t = t;
      }
    }
    复制代码
  • main関数で使用する場合は、ジェネリック型をとして指定します。Stringジェネリッククラスを使用する場合は、すべてのジェネリック型がこれを指しますString

    public class test {
      public static void main(String[] args) {
        // 新建对象
        Generic<String> g1 = new Generic<String>();
        // 使用 set 方法
        g1.setT("dzm");
      }
    }
    复制代码

    image.png

3.一般的な方法

  • 泛型方法の定義形式:

    • フォーマット:修饰符 <类型> 返回值类型 方法名(类型量名){ }

    • 例:public <T> void show(T t){ }

  • 場合:

    public class test {
      public static void main(String[] args) {
        // 使用泛型方法
        DZMLog("dzm");
        DZMLog(88);
        DZMLog(true);
      }
    
      // 泛型方法
      static <T> void DZMLog(T t) {
        System.out.println(t);
      }
    }
    复制代码

    出力:

    dzm
    88
    true
    复制代码

4.汎用インターフェースプロトコル

  • 泛型接口协议の定義形式:

    • フォーマット:修饰符 interface 接口名<类型>{ }

    • 例:public interface Generic<T>{ }

  • Generic.javaインターフェイスプロトコルを定義する

    public interface Generic<T> {
      // 接口方法定义
      public default void show(T t) {
        System.out.println(t);
      }
    }
    复制代码
  • インターフェイスプロトコルに準拠するGenericPro.javaクラスますGeneric.java

    public class GenericPro<T> implements Generic<T> {
      // 继承协议并实现协议方法
      @Override
      public void show(T t) {
        // 实现协议方法
      }
    }
    复制代码

5、ワイルドカードを入力

  • さまざまなジェネリックListの、次を使用できます。类型通配符

  • 类型通配符の定義形式:

    • ワイルドカードを入力します。<?>

    • List<?>:要素タイプが不明でListあり、その要素を一致させることができることを示します任何的类型

    • このワイルドListカードは、それがListさまざまなジェネリックの親クラスであることを示すだけであり、要素を追加することはできません。

  • 通配符的 上下限

    • 如果说我们不希望 List<?> 是任何泛型 List 的父类,只希望它代表某一类泛型 List 的父类,可以使用类型通配符的上限。

    • 类型通配符 - 上限<? extends 类型>

    • 范例 List<? extends Number>:它表示的类型是 Number或者其子类型一定不能是父类型

    • 类型通配符 - 下限<? super 类型>

    • 范例 List<? super Number>:它表示的类型是 Number或者其父类型一定不能是子类型

  • 案例:

    import java.util.List;
    import java.util.ArrayList;
    
    public class test {
      public static void main(String[] args) {
        // 类型通配符: <?>
        List<?> list1 = new ArrayList<String>();
        List<?> list2 = new ArrayList<Number>();
        List<?> list3 = new ArrayList<Integer>();
    
        // 类型通配符 上线: <? extends 类型>
        List<? extends Number> list5 = new ArrayList<String>(); // 这个会报错,因为 String 不属于 Number或者其子类型
        List<? extends Number> list6 = new ArrayList<Number>();
        List<? extends Number> list7 = new ArrayList<Integer>();
    
        // 类型通配符 下线: <? super 类型>
        List<? super Number> list5 = new ArrayList<String>(); // 这个会报错,因为 String 不属于 Number或者其父类型
        List<? super Number> list6 = new ArrayList<Number>();
        List<? super Number> list7 = new ArrayList<Integer>(); // 这个会报错,因为 Integer 不属于 Number或者其父类型
      }
    }
    复制代码

おすすめ

転載: juejin.im/post/7010954093325713445