泛型
1. 泛型类:具有一个或多个类型变量的类,称之为泛型类!
class A<T> {
}
2. 在创建泛型类实例时,需要为其类型变量赋值
A<String> a = new A<String>();
* 如果创建实例时,不给类型变量赋值,那么会有一个警告!
3. 泛型方法:具有一个或多个类型变量的方法,称之为泛型方法!
class A<T> {
public T fun(T t1) {}
}
fun()方法不是泛型方法!它是泛型类中的一个方法!
public <T> T fun(T t1) {} --> 它是泛型方法
* 泛型方法与泛型类没什么关系,泛型方法不一定非要在泛型类中!
4. 泛型在类中或方法中的使用
* 泛型类中使用泛型:
> 成员类型
> 返回值和参数类型
> 局部变量的引用上
class A<T> {
private T bean;
public T fun(T t) {}
public void fun2() {
T b = ...
new T();
}
}
=========================================
5. 泛型的继承和实现
class A<T> {}
class AA extends A<String> {}
5.1 继承泛型类
* 子类不是泛型类:需要给父类传递类型常量
> 当给父类传递的类型常量为String时,那么在父类中所有T都会被String替换!
* 子类是泛型类:可以给父类传递类型常量,也可以传递类型变量
class AA1 extends A<Integer> {}
class AA3<E> extends A<E> {}
=========================================
=========================================
=========================================
泛型的通配符
1. 通配符使用的场景
方法的形参!
2. 通配符的优点
使方法更加通用!
3. 通配符分类
无界通配:?
子类限定:? extends Object
父类限定:? super Integer
4. 通配符缺点
使变量使用上不再方便
无界:参数和返回值为泛型的方法,不能使用!
子类:参数为泛型的方法不能使用
父类:返回值为泛型的方法不能使用
5. 比较通配符
boolean addAll(Collection<E> c)
List<Number> numList = new ArrayList<Number>();
List<Integer> intList = new ArrayList<Integer>();
numList.addAll(intList);
boolean addAll(Collection<? extends E> c)
List<Number> numList = new ArrayList<Number>();
List<Integer> intList = new ArrayList<Integer>();
numList.addAll(intList);
代码实践
```java
package cn.itcast;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
public class Demo2 {
@Test
public void fun1() {
Object[] objs = new Object[10];
List list = new ArrayList();
String[] strs = new String[10];
List<String> strList = new ArrayList<String>();
Object[] objArray = new String[10];
objArray[0] = new Integer(100);
}
public void fun2() {
List<Integer> integerList = new ArrayList<Integer>();
print(integerList);
List<String> stringList = new ArrayList<String>();
print(stringList);
}
public void print(List<?> list) {
Object s = list.get(0);
}
public void fun3() {
List<Integer> integerList = new ArrayList<Integer>();
print1(integerList);
List<Long> longList = new ArrayList<Long>();
print1(longList);
List<String> stringList = new ArrayList<String>();
print1(stringList);
}
public void print1(List<? extends Number> list) {
Number n = list.get(0);
}
public void fun4() {
List<Integer> integerList = new ArrayList<Integer>();
print2(integerList);
List<Long> longList = new ArrayList<Long>();
print2(longList);
List<Object> objects = new ArrayList<Object>();
print2(objects);
}
public void print2(List<? super Integer> list) {
list.add(new Integer(100));
Object o = list.get(0);
}
}