首页 > 其他分享 >泛型

泛型

时间:2024-09-16 16:01:43浏览次数:8  
标签:String void 类型 static 泛型 public

泛型是一种类型参数。将数据的类型,当做一个参数。


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);
}

标签:String,void,类型,static,泛型,public
From: https://www.cnblogs.com/meitianyouheng/p/18416372

相关文章

  • 泛型中的 K、T、V、E、?、Object 等分别代表什么含义
    泛型中的K、T、V、E、?、Object等分别代表什么含义作为一名编程博客专家,我将带领大家深入探讨泛型中的各种类型参数,如K、T、V、E、?、Object等,这些参数在Java和其他编程语言中扮演着重要的角色。本文将详细解释这些参数的含义、用途以及如何在实际编程中应用它们。......
  • Java泛型-类型参数化
    一.泛型解决支持多类型参数的方案:1,重载:在同一个类中,方法名相同,参数不同不足之处:代码过于重复publicclassTool{  publicStringarrToStr(String[]arr,Stringsymbol){    Stringstr="";    for(Stringv:arr){      str+=s......
  • C++ | 泛型编程:模板初阶与函数模板深度解析
    文章目录C++泛型编程:模板初阶与函数模板深度解析1.泛型编程:实现代码的通用性2.函数模板:代码的模具2.1什么是函数模板?2.2函数模板的格式2.3函数模板的原理2.4函数模板的实例化2.5模板参数的匹配原则3.类模板:更进一步的通用性3.1类模板的定义3.2类模板的实例化......
  • Java箱与泛型
      大O的渐进表示法大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。voidfunc1(intN){intcount=0;for(inti=0;i<N;i++){for(intj=0;j<N;j++){count++;}}for(intk=0;k<2*N;k++){count++;}......
  • 查漏补缺1——泛型1
    泛型的背景Java推出泛型以前,程序员可以构建一个元素类型为Object的集合,该集合能够存储任意的数据类型对象,而在使用该集合时,需要明确知道存储每个元素的数据类型,否则很容易引发ClassCastException异常publicclassDemo1{publicstaticvoidmain(String[]args){......
  • 【技术详解】Java泛型:全面解析与实战应用(进阶版)
    文章目录Java泛型:全面解析与实战应用1.引言1.1什么是Java泛型?1.2泛型的历史背景1.3泛型的重要性与优势2.泛型的基本概念2.1类型参数2.2泛型类2.3泛型方法2.4泛型接口2.5泛型擦除3.创建和使用泛型类3.1定义一个简单的泛型类3.2使用泛型类3.3泛型类的类型......
  • Java基础 韩顺平老师的 泛型 的部分笔记
    553,泛型引入packagecom.hspedu.list_;importjava.util.*;importjava.util.concurrent.CompletionService;@SuppressWarnings({"all"})publicclassMap_{publicstaticvoidmain(String[]args){//使用传统的方法来解决ArrayListarrayLis......
  • 对象池泛型模板
    对象池泛型模板delphi和lazarus都适用。泛型配合继承,无敌的存在。//cxg2024-9-2//对象池的泛型模板unitsys.pool;{$idef.inc}interfaceuses//system--------Generics.Collections,Classes,SysUtils;typeTPool<T>=classprivate//连接池的空闲......
  • 【Java学习】内部类&泛型
    一、内部类内部类是类中的五大成分之一(成员变量、方法、构造器、代码块、内部类);如果一个类定义在另一个类的内部,这个类就是内部类;场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。内部类分为四种成员内部类:位于一个类......
  • JAVA高级编程之集合框架和泛型(超详细)
    Java集合框架包含的内容Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中Collection接口存储一组不唯一,无序的对象List接口存储一组不唯一,有序(插入顺序)的对象Set接口存储一组唯一,无序的对象Map接口存储一组键值对象,提供key到value的映......