Java中的泛型

读书声起五更天發表於2024-09-16

泛型是一種型別引數。將資料的型別,當做一個引數。


1. 泛型的作用

  • 在建立集合物件的時候,限定集合儲存元素的型別
  • 在編譯的時候,就進行型別檢查;

2. 泛型的使用規則

  • 如果不指定泛型,預設是Object型別
  • 泛型擦除:泛型應用於程式碼編譯期,程式執行的後,泛型就被擦除了。即執行期,泛型被擦除。
  • 同時指定多個泛型<E1,E2,E3,....>
  • 靜態方法中,不能使用泛型類或泛型介面。
  • 泛型方法,可以是靜態的。 因為方法被呼叫時,才確定泛型引數的型別
  • 泛型陣列:
 E[] elements = (E[])new Object[capacity];

3. 泛型的分類

  • 泛型類
    類中的某個屬性,在定義的時候,不能確定是什麼型別,可以使用泛型表示該屬性的型別
  • 泛型介面
    介面中的方法引數型別 或 返回值型別,不確定的時候,使用泛型替代
  • 泛型方法
    類上面沒有泛型,但是方法上指定了泛型。一般用於工具類,不能例項化物件
    方法的引數型別或返回值型別,不能確定的時候,使用泛型代替


4. 萬用字元的使用

萬用字元用於指定泛型的範圍(上限和下限)

  • ? 任意型別

    List<?>:只能寫入null值。

  • <? super 型別>:當前型別或當前型別的父型別

  • <? extends 型別>:當前型別或當前型別的子類


5. 應用例項

泛型介面的使用

//泛型介面
public interface MyCollection<T> {
    void add(T t);
}

//情況1:子類定義是,直接指定泛型的具體型別
public class MyCollectionImpl01 implements MyCollection<Integer> {
    @Override
    public void add(Integer integer) {

    }
}

//情況2:子類是一個泛型類
public class MyCollectionImpl02<T> implements MyCollection<T> {
    @Override
    public void add(T t) {

    }
}

泛型方法的使用

/**
 * 列印不同型別的集合
 */
public <E> void printAll(E e){
    if(e instanceof Collection){
        ((Collection) e).forEach(System.out::println);
    }else if( e instanceof Map){
        Set set = ((Map) e).entrySet();
        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            Map.Entry next = (Map.Entry) iterator.next();
            System.out.println(next.getKey()+" "+next.getValue());
        }
    }else{
        System.out.println(e);
    }
}

查詢所有的記錄

引入依賴

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.3</version>
</dependency>


JavaBean實體類

public class Book{
    private Integer id;
    private  String bookName;
    private  String author;
    private  Double price;


JDBC 工具類

/**
 * 工具類:獲取MySQL資料庫連線
 */
public class JDBCUtil {
    private static final String DRIVER = "com.mysql.jdbc.Driver";

    //資料庫連線引數
    private static final String URL = "jdbc:mysql://localhost/db_day525";
    private static final String NAME = "root";
    private static final String PASSWORD = "admin";

    //註冊驅動(僅註冊1次)
    static {
        try {
            Class.forName(DRIVER);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //資料庫連線
    public static Connection getConnection() {
        try {
            return DriverManager.getConnection(URL, NAME, PASSWORD);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    //釋放資源
    public static void close(Connection conn, Statement stmt) {
        close(conn, stmt, null);//方法重用
    }
    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        try {
            if (stmt != null) {
                stmt.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        try {
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}


Dao層
泛型介面

/**
 * Dao層泛型介面:通用的CURD方法
 */
public interface Dao<T> {
    /**
     * 新增一條記錄
     * @param t
     */
    void insert(T t);
    
    /**
     * 刪除一條記錄
     * @param t
     */
    void delete(T t);
    

    /**
     *查詢所有資料
     */
    List<T> selectAll() throws SQLException;
    

    /**
     * 查詢一個資料:根據id
     */
    T select(int index);
    

    /**
     * 修改一條記錄:根據id
     */
    void update(int index, T t);
}

實現類

public class BookDaoImpl implements Dao<Book> {
    Connection conn = JDBCUtil.getConnection();

    @Override
    public List<Book> selectAll() throws SQLException {
        List<Book> list = new ArrayList<>();
        String sql = "select book_id as id,book_name as bookName,author,price from t_book";

        PreparedStatement preStatement = conn.prepareStatement(sql);
        ResultSet resultSet = preStatement.executeQuery();

        while(resultSet.next()){
            int bookId = resultSet.getInt(1);
            String bookName = resultSet.getString(2);
            String author = resultSet.getString(3);
            Double price = resultSet.getDouble(4);

            list.add(new Book(bookId,bookName,author,price));
        }
        return list;
    }
    
    @Override
    public void insert(Book book) {}
    @Override
    public void delete(Book book) {}
    @Override
    public Book select(int index) {return null;}
    @Override
    public void update(int index, Book book) {}
}


測試

public static void main(String[] args) throws SQLException {
    Dao dao = new BookDaoImpl();
    List list = dao.selectAll();

    list.forEach(System.out::print);
}

相關文章