- 泛型和通配符的使用
- 一、泛型的概念
- 1.泛型是什么?
- 2.为什么要有泛型(集合举例)
- 2.1.没有泛型的不足
- 2.2.泛型完善的地方
- 二、自定义泛型
- 1.自定义泛型结构
- 2.泛型类
- 2.1.注意事项
- 3.泛型方法
- 4.泛型继承上面的使用
- 三、通配符及使用
- 1.通配符一般情况使用
- 2.通配符有限制条件的使用
一、泛型的概念 1.泛型是什么?
泛型就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型(必须是类,基础类型不可以)参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实际的类型参数,也称为类型实参)。
2.为什么要有泛型(集合举例) 2.1.没有泛型的不足
public static void genericInCollection()
{
ArrayList objects = new ArrayList();
objects.add(1);
objects.add(2);
objects.add(3);
objects.add("你好");
for (Object object : objects) {
Integer i = (Integer) object;
//向下转型时候容易引起异常 ClassCastException
System.out.println("i = " + i);
}
}
2.2.泛型完善的地方
public static void genericInCollection2()
{
ArrayList objects = new ArrayList<>();
objects.add(1);
objects.add(2);
objects.add(3);
// 类型不符合的,编译无法通过
// objects.add("D");
for (Integer object : objects)
{
int i = object;
System.out.println("i = " + i);
}
}
二、自定义泛型
1.自定义泛型结构
public class GenericClass2.泛型类{ X x; Y y; Z z; public static void main(String[] args) { GenericClass aClass = new GenericClass<>(); GenericClass bClass = new GenericClass<>(); } } class GenericClass1 extends GenericClass { } interface GenericInter { T getCode(T t); } class GenericInterClass implements GenericInter { @Override public Integer getCode(Integer integer) { return integer; } }
public class GenericClass2.1.注意事项{ //泛型类型 X x; //泛型方法 public X getX() { return x; } //泛型构造器 public GenericClass(X x) { this.x = x; } //泛型构造器 public GenericClass() { } public void setX(X x) { this.x = x; } @Override public String toString() { return "GenericClass{" + "x=" + x + '}'; } public static void main(String[] args) { //实例化的时候没有指明泛型类型,默认为object类型 GenericClass genericClass = new GenericClass(); genericClass.setX(12); GenericClass1 genericClass1 = new GenericClass1(); genericClass1.setX("123"); } } //继承泛型类的子类,可以声明父类的泛型类型, class GenericClass1 extends GenericClass { } //继承泛型类的子类,也可以全部保留泛型,也可以部分保留泛型 //子类仍是泛型类子类实例化的时候在进行确定 //子类也可以自己新增泛型 class GenericClass2 extends GenericClass { }
- 异常类不能是泛型
- 静态方法里面不能使用类的泛型(静态方法在类实例化之前,而类的泛型是在类的实例化确定)
//泛型类,如果对应的泛型不相同,不能进行赋值 ArrayList3.泛型方法strings = new ArrayList<>(); ArrayList integers = new ArrayList<>(); strings = integers;
public static Boolean genericMethod1(String s,T t)
{
if (t==null) {
return true;
}
return t.toString().length() > s.length();
}
public static void main(String[] args) {
System.out.println("genericMethod1("123",000) = " + genericMethod1("123", 000));
}
4.泛型继承上面的使用
// 如果B是A的一个子类型(子类或者子接口),而G是具有泛型声明的类或接口,
// G并不是G的子类型,无法由父类引用
Object o = new Object();
String s = new String();
o = s;
ArrayList
三、通配符及使用
1.通配符一般情况使用
public class WildCard1
{
public static void main(String[] args)
{
List
2.通配符有限制条件的使用
public class WildCard2
{
public static void main(String[] args)
{
// 可以赋值泛型为 Fruit 或者 Fruit子类 实例
List extends Fruit> extendList = new ArrayList<>();
// 可以赋值泛型为 Fruit 或者 Fruit父类 实例
List super Fruit> superList = new ArrayList<>();
List fruits = new ArrayList<>();
List apples = new ArrayList<>();
List 


