java, golang, python 泛型, 異常, 裝飾器等範例講解

java泛型

  • 下面的程序在編譯階段不會發現錯誤, 但是在運行時會出現錯誤

    java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    
    List array_list = new ArrayList();
    array_list.add("aaaa");
    array_list.add(100);
    
    for (int i = 0; i < array_list.size(); i++) {
      String item = (String)array_list.get(i);
      Log.d("泛型測試", "item=" + item)
    }
    
  • 我們要讓程序在編譯階段就可以發現這個錯誤, 程序可以改寫成

    List<String> array_list = new ArrayList<String>();
    array_list.add("aaaa");
    array_list.add(100);
    
    for (int i = 0; i < array_list.size(); i++) {
      String item = (String)array_list.get(i);
      Log.d("泛型測試", "item=" + item)
    }
    

這樣上面的程序就會在編譯階段就發現錯誤, 避免產生bug。

  • 泛型的特性

    List<String> string_array_list = new ArrayList<String>();
    List<Integer> integer_array_list = new ArrayList<Integer>();
    
    Class class_string_array_list = string_array_list.getClass();
    Calss class_integer_array_list = integer_array_list.getClass(); 
    
    if (class_string_array_list.equals(class_integer_array_list)) {
      Log.d("泛型測試", "輸出結果爲類型相同")
    }
    
    

泛型類型在邏輯上看以看成是多個不同的類型,實際上都是相同的基本類型。

泛型有三種使用方式,分別爲:泛型類、泛型接口、泛型方法

  • 泛型類
# 一個普通的泛型類

//此處T可以隨便寫爲任意標識,常見的如T、E、K、V等形式的參數常用於表示泛型
//在實例化泛型類時,必須指定T的具體類型

public class Generic<T> {
  //key這個成員變量的類型爲T,T的類型由外部指定  
  private T key;

   //泛型構造方法形參key的類型也爲T,T的類型由外部指定
  public Generic(T key) {
    this.key = key;
  }

  //泛型方法getKey的返回值類型爲T,T的類型由外部指定
  public T getKey() {
    return this.key;
  }
}


// 實例化上面的類

// 整型
Generic<Integer> generic_integer = new Generic<Integer>(12345);
Log.d("泛型測試", "key is " + generic_integer.getKey());


// 字符型
Generic<String> generic_string = new Generic<String>("hello");
Log.d("泛型測試", "key is " + generic_string.getKey());


Generic generic = new Generic("111111");
Generic generic1 = new Generic(4444);
Generic generic2 = new Generic(55.55);
Generic generic3 = new Generic(false);

Log.d("泛型測試","key is " + generic.getKey());
Log.d("泛型測試","key is " + generic1.getKey());
Log.d("泛型測試","key is " + generic2.getKey());
Log.d("泛型測試","key is " + generic3.getKey());


D/泛型測試: key is 111111
D/泛型測試: key is 4444
D/泛型測試: key is 55.55
D/泛型測試: key is false

  • 泛型接口

# 定義一個泛型接口
public interface Generator<T> {
  public T next();
}


/**
 * 未傳入泛型實參時,與泛型類的定義相同,在聲明類的時候,需將泛型的聲明也一起加到類中
 * 即:class FruitGenerator<T> implements Generator<T>{
 * 如果不聲明泛型,如:class FruitGenerator implements Generator<T>,編譯器會報錯:"Unknown class"
 */
class FruitGenerator<T> implements Generator<T>{
    @Override
    public T next() {
        return null;
    }
}


public class FruitGenerator implements Generator<String> {
  private String[] fruits = new String[]{"apple", "banana", "pear"};

  @Override
  public String next() {
    Random random = new Random();
    return fruits[random.nextInt(3)];
  }
}

  • 泛型通配符
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章