java泛型的基本应用
- 格式:集合类<引用类型> 变量名 = new 集合类<类类型>()
- 声明好泛型类型之后,集合中只能存放特定的类型元素
- 泛型类型必须是引用类型
- 使用泛型后去出的元素不需要类型转换
泛型方法
- 需求:写一个函数,调用者传递什么类型的变量,该函数就返回什么类型的变量
实现一
/*
由于无法确定具体传递什么类型的数据,那么方法的形参就定义为Object类型,
返回值就是Object类型缺点:但是使用函数时需要强制类型转换
*/
private Object getDate(Object obj){
return obj;
}
实现二
使用泛型的自定义来解决以上问题
泛型:就是将类型当做变量处理。规范泛型的定义一般是一个大写的字母
public<泛型的声明> 返回值类型 函数名(泛型 变量名){
}
public static void main(String[] args){
int[] arr = {1,2,3,4,5};
new Demo().getData(5);
}
public<T> T getData(T data){
return data;
}
注意
- 静态方法不可以使用类中定义的泛型,因为类中的泛型需要在对象初始化时指定具体类型,而静态类优先对象的存在。那么类中的静态方法就需要单独进行泛型声明,声明泛型一定要写在static后,返回类型之前
创建对象的时候要指定泛型的具体类型- 1、 创建对象的时候要指定泛型的具体类型。
- 2、穿件队形是可以不指定泛型的具体类型(和创建集合对象一样)。默认Object,例如我们使用集合储存元素的时候没有使用泛型,那么参数的类型就是Object
- 3、类上面声明的泛型只能用于非静态成员函数,如果静态函数需要使用泛型,那么需要在函数上独立声明。
- 4、如果建立对象后指定了泛型的具体类型,那么该对象操作方法时,这些方法只能操作一种数据类型。
- 5、既可以在类上的泛型声明,也可以在同时在该类的方法中声明泛型
泛型练习
/**
* Created by SunMing on 2016/9/18.
*/
public class Demo7 {
public static void main(String[] args) {
Father<String> father = new Father<String>("lalala");
System.out.println(father.getT());
Father<Integer> father2 = new Father<Integer>(65536);
System.out.println(father2.getT());
}
}
class Father<T>{
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
public Father(){
}
public Father(T t){
this.t = t;
}
}
带子类的实现
//子类指定了具体的类型
class Son extends Father<String>{
}
//子类也需要使用泛型
class Son3<T> extends Father<T>{
}
//错误写法,父类上定义有泛型需要进行处理
class Son2 extends Father<T>{
}
泛型接口
/**
* Created by SunMing on 2016/9/18.
*/
public class Demo8 {
public static void main(String[] args){
MyInter<String> my = new MyInter<String>();
my.print("发发");
Myinter2 my2 = new Myinter2();
my2.print("只能传字符串");
}
}
//定义接口
interface Inter<T>{
void print(T t);
}
// 实现不知为何类型时可以这样定义
class MyInter<T> implements Inter<T>{
@Override
public void print(T t) {
System.out.println(t);
}
}
//使用接口时明确具体类型。
class Myinter2 implements Inter<String>{
@Override
public void print(String s) {
System.out.println(s);
}
}