1、泛型实例及好处
package cn.itcast.genecity;
import java.util.ArrayList;
/*
泛型 的好处:
1. 把运行时出现 的问题提前至了编译时。
2. 避免了无谓的强制类型转换。
泛型在集合中的应用:
ArrayList<String> list = new ArrayList<String>(); true true true
ArrayList<Object> list = new ArrayList<String>(); true true false
ArrayList<String> list = new ArrayList<Object>(); false true false
考虑到新老系统兼用性:
ArrayList list = new ArrayList<String>(); false false true
ArrayList<String> list = new ArrayList(); true false false
注意: 在泛型中没有多态的概念,两边的数据必须要一致。 或者是只写一边 的泛型类型。
推荐使用: 两边的数据类型都写上一致的。
*/
public class Demo1 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
// list.add(123); //添加了非字符串类型的数据。
//把集合中的所有元素转换成大写。
for(int i = 0 ; i < list.size() ; i++){
String str = list.get(i);
System.out.println(str.toUpperCase());
}
}
}
2、泛型方法
package cn.itcast.genecity;
/*
自定义泛型: 自定义泛型可以理解为是一个数据类型的占位符,或者是理解为是一个数据类型的变量。
泛型方法:
泛型方法的定义格式:
修饰符 <声明自定义泛型>返回值类型 函数名(形参列表..){
}
注意:
1. 在方法上的自定义泛型的具体数据类型是调用该方法的时候传入实参的时候确定的。
2. 自定义泛型使用的标识符只要符合标识符的命名规则即可。
需求: 定义一个函数可以接收任意类型的参数,要求函数的返回值类型与实参的数据类型要一致。
*/
public class Demo2 {
public static void main(String[] args) {
Integer i= print(12); // Integer
String str = print("abc");
System.out.println(i);
System.out.println(str);
}
//<T> 把T字母声明为自定义 的泛型、
public static <abc> abc print(abc o){
return o;
}
}
3、泛型类
package cn.itcast.genecity;
import java.util.ArrayList;
import java.util.Comparator;
/*
泛型类
泛型类的定义格式:
class 类名<声明自定义的泛型>{
}
注意的事项:
1. 在类上自定义的泛型的具体数据类型是在创建对象的时候指定的。
2. 在类上自定义了泛型,如果创建该类的对象时没有指定泛型的具体类型,那么默认是Object类型。
*/
class Worker implements Comparator<Worker>{
@Override
public int compare(Worker o1, Worker o2) {
// TODO Auto-generated method stub
return 0;
}
}
//自定义 一个集合对象
class MyList<T>{
Object[] arr = new Object[10];
int index = 0;
public MyList(){
}
public void add(T o){
arr[index++] = o;
}
}
public class Demo3 {
public static void main(String[] args) {
MyList<String> list= new MyList<String>();
list.add("123");
MyList list2 = new MyList();
new ArrayList<String>();
}
}
4、泛型接口
package cn.itcast.genecity;
/*
泛型接口:
泛型接口的定义格式:
interface 接口名<声明自定义的泛型>{
}
在接口上自定义泛型要注意的事项:
1. 在接口上自定义泛型的具体数据类型是在实现该接口的时候指定的。
2. 如果一个接口自定义了泛型,在实现该接口的时候没有指定具体的数据类型,那么默认是Object数据类型。
如果想在创建接口实现类对象的时候再指定接口自定义泛型 的具体数据类型?
*/
interface Dao<T>{
public void add(T t);
public void remove(T t);
}
public class Demo4<T> implements Dao<T>{
public static void main(String[] args) {
new Demo4<String>();
}
@Override
public void add(T t) {
// TODO Auto-generated method stub
}
@Override
public void remove(T t) {
// TODO Auto-generated method stub
}
}