#泛型
所谓的泛型,就是允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态指定(即传入实际的类型参数)。
静态方法、静态初始化块、静态变量的声明不允许使用类型形参。
List<String> strList = new ArrayList<>();
//限定了该List集合只能保存字符串对象,不能将其他类型的数据放进List中
#### 定义泛型接口、类 ####
定义接口时定义一个类型形参E,在接口里E可以作为类型使用。
public interface List<E>{
void add(E e);
Iterator<E> iterator();
}
可以为任何类、接口添加泛型声明,使用类时可以传入实际形参。
public class Apple<T>{
//使用T类型定义实例变量
private T info;
public Apple(T info){
this.info = info;
}
public void setInfo(T info){
this.info = info;
}
public T getInfo(T info){
return this.info;
}
}
//实例化时
Apple<String> a = new Apple<>("苹果");
Apple<Double> b = new Apple<>("5.67");
#### 从泛型类派生子类 ####
public class A extends Apple<String>//在Apple类中所有的T形参都会替换成String类型
或者
public class A extends Apple//编译器会提出泛型警告
//错误代码
public class A extends Apple<T>{}
#### 类型通配符 ####
为了表示各种泛型的父类,可以使用类型通配符(?),将一个问号作为类型实参传给List集合,写作:List<?>(意思是元素类型未知的List)。通配符的元素类型可以匹配任何类型。
类型通配符上限(下限用super):
//表示Shape泛型List的父类
List<? extends Shape>//在使用时只要List后面的尖括号的类型是Shape的子类型即可
设定类型形参上限(下限用super):
public class Apple<T extends Number>{
private T apple;
}
#### 泛型方法 ####
所谓的泛型方法,就是在声明方法时定义一个或者多个类型形参,格式如下:
修饰符 <T,S> 返回值类型 方法名 (形参列表){
方法体;
}
示例:
static <T> void fromArrayToCollection(T[] a, Collection<T> c){
for (T o: a) {
c.add(o);
}
}
所谓的泛型,就是允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态指定(即传入实际的类型参数)。
静态方法、静态初始化块、静态变量的声明不允许使用类型形参。
List<String> strList = new ArrayList<>();
//限定了该List集合只能保存字符串对象,不能将其他类型的数据放进List中
#### 定义泛型接口、类 ####
定义接口时定义一个类型形参E,在接口里E可以作为类型使用。
public interface List<E>{
void add(E e);
Iterator<E> iterator();
}
可以为任何类、接口添加泛型声明,使用类时可以传入实际形参。
public class Apple<T>{
//使用T类型定义实例变量
private T info;
public Apple(T info){
this.info = info;
}
public void setInfo(T info){
this.info = info;
}
public T getInfo(T info){
return this.info;
}
}
//实例化时
Apple<String> a = new Apple<>("苹果");
Apple<Double> b = new Apple<>("5.67");
#### 从泛型类派生子类 ####
public class A extends Apple<String>//在Apple类中所有的T形参都会替换成String类型
或者
public class A extends Apple//编译器会提出泛型警告
//错误代码
public class A extends Apple<T>{}
#### 类型通配符 ####
为了表示各种泛型的父类,可以使用类型通配符(?),将一个问号作为类型实参传给List集合,写作:List<?>(意思是元素类型未知的List)。通配符的元素类型可以匹配任何类型。
类型通配符上限(下限用super):
//表示Shape泛型List的父类
List<? extends Shape>//在使用时只要List后面的尖括号的类型是Shape的子类型即可
设定类型形参上限(下限用super):
public class Apple<T extends Number>{
private T apple;
}
#### 泛型方法 ####
所谓的泛型方法,就是在声明方法时定义一个或者多个类型形参,格式如下:
修饰符 <T,S> 返回值类型 方法名 (形参列表){
方法体;
}
示例:
static <T> void fromArrayToCollection(T[] a, Collection<T> c){
for (T o: a) {
c.add(o);
}
}