Java中的泛型

news/2024/9/20 15:07:46

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


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> {@Overridepublic void add(Integer integer) {}
}//情况2:子类是一个泛型类
public class MyCollectionImpl02<T> implements MyCollection<T> {@Overridepublic 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();@Overridepublic 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;}@Overridepublic void insert(Book book) {}@Overridepublic void delete(Book book) {}@Overridepublic Book select(int index) {return null;}@Overridepublic 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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/61021.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

urllib自定义opener对象设置代理IP

urllib.request.urlopen()源代码——urlopen()在干什么返回opener.open(url, data, timeout)方法的结果_opener = None # _opener被赋值为None def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,*, cafile=None, capath=None, cadefault=False, context=N…

成功塑造孩子的人生,这一步很关键!

塑造孩子行为极为重要 思维决定行为,行为决定习惯,这一理念在家庭教育中尤为重要。明智的家长如同经验丰富的指导者,细心关注并引领孩子塑造正确的行为。他们深知每个孩子都是独一无二的,拥有独特的性格与潜力,不可简单复制或预设。当孩子遭遇困难时,应及时给予支持引导其…

CSP 初赛要点复习

位运算 逻辑与、按位与之类的东西是不同的!“逻辑”的是判断两个数都不为 \(0\),“按位”的是判断两个数的每一个二进制位与的结果,是不同的。其他运算也类似。 运算符优先级如图所示:注意,~ 和 ! 是同级的。 加法位运算表示:a+b=(a^b)+((a&b)<<1)。

7、队列

1、链队#include<stdio.h> #include<malloc.h> #include<assert.h>#define ElemType inttypedef struct QueueNode{ElemType data;struct QueueNode* next; }QueueNode; typedef struct LinkQueue{QueueNode* front;//队头QueueNode* tail;//队尾 }LinkQueu…

初识Docker容器

初识Docker容器1. 什么是DockerDocker 是一个开源的容器化平台,用于自动化部署和管理应用程序。它通过将应用程序及其所有依赖打包成一个轻量级、可移植的容器来解决传统虚拟化中的性能开销问题。Docker 容器可以在任何支持 Docker 的环境中运行,无论是本地开发环境、测试服务…

内存对齐和缓冲区溢出攻击

.一、问候语 欢迎你来到我的博客! 二、什么是内存对齐计算机中内存空间都是按照字节(byte)进行划分的,所以从理论上讲对于任何类型的变量访问都可以从任意地址开始,但是在实际情况中,在访问特定类型变量的时候经常在特定的内存地址访问,所以这就需要把各种类型数据按照一定…

ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)

名词缩写ASID:Address Space ID 地址空间标识符 CD:Context Descriptor; 上下文描述符; CTP:Context-table pointer 上下文表指针 EPT:Extended Page Table 扩展页表 GPA:Guest Phyical Address 客人的实际地址 GVA:Guest Virtual Address 访客虚拟地址 HPA:Host…

博客园评论区头像换页更新解决方案

使用 MutationObserver 解决了评论区头像换页无法更新的问题。前言 博客园博客正文的评论区的每一条评论其实都是带用户头像链接的,因此有些博客主题利用这个链接,对评论新增了头像显示功能。 但是这部分功能只能在第一次加载页面时有效,一旦出现评论翻页、排序等操作,头像…