不想把狗放到鸡窝里?那就使用泛型
泛型在Java语言中也是一个重要的概念,利用泛型可以告诉编译器我们需要什么样的类型。泛型经常作用于容器上,比如前面我们说到的List、Set和Map中。利用泛型可以让我们的代码更加的泛化。
泛型作用于类
泛型不仅可以作用于类上:
public class Xpp<T> {
private T a;
public Xpp(T a) {
this.a = a;
}
public void set(T a) {
this.a = a;
}
public T get() {
return a;
}
}
需要使用什么类型参数,就在类名后面添加尖括号,尖括号中是T,T是Type的意思,也就是Java类,表示的是类型参数,暂时不指定类型。
泛型也可以作用于匿名内部类。
泛型作用于方法
泛型还可以作用于方法上:
public class Xpp {
public <T> void foo(T x) {
System.out.println(x.getClass().getName());
}
public static <T> List<T> makeList(T... args) {
List<T> result = new ArrayList<T>();
for (T item : args)
result.add(item);
return result;
}
public static void main(String[] args) {
Xpp xpp = new Xpp();
xpp.foo("");
xpp.foo(1);
xpp.foo(1.0);
List<String> ls = makeList("A");
System.out.println(ls);
ls = makeList("A", "B", "C");
System.out.println(ls);
}
}
这里定义了两个泛型的方法,第一个方法可以传入任何类型的参数,可以看出返回的参数类型也是任何类型的参数。
这个代码的输出结果为参数类型,即 java.lang.String
java.lang.Integer
和java.lang.Double
,
第二个方法表示可以传入不定数目的任何类型的参数,使用T... args
来表示。
泛型作用于接口
泛型还可以作用于接口上: 定义接口:
public interface Xpp<T> {
T next();
}
这里定义了一个泛型的接口,可以有如下的实现类:
public class Integer implements Generator<java.lang.Integer> {
private int value = 0;
public java.lang.Integer next() {
return value++;
}
}
实现类中指明了具体的参数类型为Integer类型。
泛型标记符
泛型标记符除了我们上面用到的T,还有E,E表示集合元素Element,一般在集合中使用,?表示不确定的Java类型,<? extends Xpp>
表示可以使用Xpp和它的子类,<? super Person>
表示可以使用Xpp和它的父类
总结
这篇文章主要讲了泛型的一些知识点,包括他可以作用于普通类、匿名内部类、方法、接口上,使用泛型可以让我们的代码更加泛化,值得注意的是,泛型并不是一开始就有的,而是后来加进来的。泛型主要是容器中使用,保证一定的安全的需要,防止其他类型的对象放入了不属于它的集合中。
❤️ 感谢大家
如果你觉得这篇内容对你挺有有帮助的话: