public void save(List p){
}
public void save(List d){ // 报错: 与上面方法编译后一样
}
泛型写法
正确写法:
List
错误写法:
//泛型类型要一致
List list4 = new ArrayList();
// 泛型类型必须是引用类型,不能为基本类型
List list5 = new ArrayList();
泛型方法/泛型类/泛型接口
泛型方法:
// 定义泛型方法
public T save(T t,K k) {
return null;
}
// 使用泛型方法: 在使用泛型方法的时候,确定泛型类型
save(1.0f, 1);
泛型类:
public class GenericDemo {
// 定义泛型方法
public T save(T t,K k) {
return null;
}
}
// 泛型类: 在创建爱泛型类对象的时候,确定类型
GenericDemo demo = new GenericDemo();
泛型接口:
//定义泛型接口
public interface IBaseDao {
void save(T t );
void update(T t );
}
泛型接口类型确定:
实现泛型接口的类也是抽象,那么类型在具体的实现中确定或创建泛型类的时候确定
public class BaseDao implements IBaseDao {}
在业务实现类中直接确定接口的类型
public class PersonDao implements IBaseDao{}
泛型关键字:
在泛型中:
? 指定只是接收值
extends 元素的类型必须继承自指定的类
super 元素的类型必须是指定的类的父类
关键字 ?
//只带泛型特征的方法
public void save(List> list) {
// 只能获取、迭代list; 不能编辑list
}
// ? 可以接收任何泛型集合, 但是不能编辑集合值; 所以一般在方法参数中用
List> list = new ArrayList();
//list.add("");// 报错
关键字: extends【上限】
list集合只能处理 Double/Float/Integer等类型
限定元素范围:元素的类型要继承自Number类 (上限)
public void save(List extends Number> list) {
}
List list_1 = new ArrayList();
List list_2 = new ArrayList();
List list_3 = new ArrayList();
List list_4 = new ArrayList();
// 调用
save(list_1);
save(list_2);
save(list_3);
save(list_4); //报错
关键字 : super【下限】
super限定元素范围:必须是父类(Object)或者本身(String)【下限】
public void save(List super String> list) {
}
// 调用上面方法,必须传入String的父类
List list1 = new ArrayList();
List list2 = new ArrayList();
List list3 = new ArrayList();
save(list3); //报错
泛型的反射
Type 接口,任何类型默认的接口!
包括: 引用类型、原始类型、参数化类型
List list = new ArrayList();
泛型集合: list
集合元素定义:new ArrayList(); 中的String
参数化类型: ParameterizedType
即:“ArrayList” 为参数化类型
泛型反射的案例:通用的jdbc方法
我们使用一个通用的BaseDao方法去存储基本的jdbc方法
由于本案例使用的数据库时Oracle数据库,还有DBUtil组件,所以需要导入相应的包
下面先写BaseDao类
public class BaseDao {
private Class clazz;
private String tableName;
/**
* 构造函数:
* 1. 获取当前运行类的参数化类型;
* 2. 获取参数化类型中实际类型的定义(class)
*/
public BaseDao(){
// this 表示当前运行类 (AccountDao/StudentDao)
// this.getClass() 当前运行类的字节码(AccountDao.class/StudentDao.class)
// this.getClass().getGenericSuperclass(); 当前运行类的父类,即为BaseDao
// ParameterizedType,其实就是“参数化类型”
//获取当前运行类的父类,Type类型表示任意类型
Type type = this.getClass().getGenericSuperclass();
//强制转换为ParameterizedType(参数化)类型
ParameterizedType pt = (ParameterizedType) type;
// 获取参数化类型中类似【new Type[]{Account.class}】,获取实际的参数类型
Type[] types = pt.getActualTypeArguments();
//获取数据的第一个元素:Account.class
clazz = (Class) types[0];
//获取表名
tableName = clazz.getSimpleName();
}
public T findById(int id){
Connection conn = null;
String sql = "select * from " + tableName + " where id = ?";
try {
conn = ConnectionFactory.getConnection();
System.out.println(tableName);
QueryRunner qr = new QueryRunner();
return qr.query(conn,sql, new BeanHandler(clazz),id);
} catch (SQLException e) {
throw new RuntimeException(e);
}finally{
ConnectionFactory.close(conn, null, null, null);
}
}
/**
* 获取所有
* @return
*/
public List getAll(){
Connection conn = null;
String sql = "select * from " + tableName;
try {
conn = ConnectionFactory.getConnection();
return new QueryRunner().query(conn, sql,new BeanListHandler(clazz));
} catch (SQLException e) {
throw new RuntimeException(e);
}finally{
ConnectionFactory.close(conn, null, null, null);
}
}
}
用原型函数(prototype)可以定义一些很方便的自定义函数,实现各种自定义功能。本次主要是实现了Array的去重、获取最大值和最小值。
实现代码如下:
<script type="text/javascript">
Array.prototype.unique = function() {
var a = {};
var le
ORACLE
下面这个效率很低
SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM IPAY_RCD_FS_RETURN order by id desc) A ) WHERE RN <20;
下面这个效率很高
SELECT A.*, ROWNUM RN FROM (SELECT * FROM IPAY_RCD_
Reverse a singly linked list.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
p