java泛型-泛型类、接口
泛型类的语法
Class 类名称<泛型标识, 泛型标识, ...> {
private 泛型标识 变量名;
.....
}
常用的泛型标识:T E K V
-
使用语法:
类名<具体的数据类型> 对象名 = new 类名<>();
代码示例
/**
* 泛型类定义
* @param <T> 泛型标识-参数类型
* T 创建对象的时候指定其具体的数据类型
*/
public class ProductGetter<T> {
Random random = new Random();
private T product;
List<T> list = new ArrayList<>();
public void addProduct(T t) {
list.add(t);
}
public T getProduct() {
product = list.get(random.nextInt(list.size()));
return product;
}
}
public class MainClass {
public static void main(String[] args) {
ProductGetter<String> productGetter = new ProductGetter<>();
productGetter.addProduct("iphone12");
productGetter.addProduct("");
productGetter.addProduct("扫地机器人");
productGetter.addProduct("咖啡机");
productGetter.addProduct("");
productGetter.addProduct("");
productGetter.addProduct("");
String product = productGetter.getProduct();
System.out.println(product);
}
}
泛型类的注意事项
- 泛型类,如果没有指定具体的数据类型,此时,操作类型是Object
- 泛型的类型参数只能是类类型,不能是基本数据类型
- 泛型类型在逻辑上可以看成是多个不同的类型,但实际上都是相同的类型
泛型类派生子类
子类也是泛型类,子类和父类的泛型类型要一致
Class ChildGeneric<T> extends Generic<T>
子类不是泛型类,父类要明确泛型的数据类型,否则默认为Object
Class ChildGeneric extends Generic<String>
代码示例
/**
* 泛型父类
* @param <E>
*/
public class Parent<E> {
private E value;
public E getValue() {
return value;
}
public void setValue(E value) {
this.value = value;
}
}
/**
* 泛型类派生子类,如果子类也是泛型那么子类的泛型标识要和父类一致
* @author Administrator
* @param <T>
*/
public class ChildFirst<T, E> extends Parent<T> {
}
/**
* 泛型类派生子类,如果子类不是泛型类,父类要明确泛型类型,否则默认为Object
* @author Administrator
* @param <T>
*/
public class ChildSecond extends Parent<String> {
}
泛型接口的定义语法
interface 接口名称 <泛型标识, 泛型标识, ...> {
泛型标识 方法名();
......
}
泛型接口的使用
实现类不是泛型类,接口要明确数据类型
class Pear2 implements Generator<String>
实现类也是泛型类,实现类和接口的泛型类型要一致
class Pear<T, E> implements Generator<T>
代码示例
/**
* 泛型接口
*
* @param <T>
*/
public interface Generator<T> {
T getKey();
}
/**
*实现类不加泛型,默认Object
*/
public class Apple implements Generator {
@Override
public Object getKey() {
return null;
}
}
/**
* 实现类指定泛型与服了相同
*/
class Pear<T, E> implements Generator<T> {
private E value;
@Override
public T getKey() {
return null;
}
}
/**
* 实现类指定泛型类型
*/
class Pear2 implements Generator<String> {
@Override
public String getKey() {
return null;
}
}