泛型:
在编译阶段检查了类型是否一致,避免了向下转型时类型转换异常
//定义一个泛型类
public class TestMethod <T>{
//只是使用了泛型参数的普通方法
public void testMethod(T t){
System.out.println(t);
}
/**
* 使用了泛型定义的泛型方法,
* 泛型方法以自己的类型参数为准,
* 与泛型类中的T无关
*/
public <E> E funMethod(E e){
return e;
}
public static void main(String[] args) {
TestMethod<String> testMethod = new TestMethod();
testMethod.testMethod("泛型NB"); //泛型NB
Integer i1 = testMethod.funMethod(123);
System.out.println(i1); //123
}
}
泛型可以声明在接口中,子类可以有两种选择 :
public interface IMessage <T>{
void print(T t);
}
a.子类继续保留泛型
/**
* 子类实现接口时,继续使用泛型,子类也不知到要使用什么类型
* @param <T>
*/
public class MessageImpl1 <T> implements IMessage<T>{
@Override
public void print(T t) {
System.out.println(t);
}
}
b.子类明确类型
/**
* 子类在实现接口时明确类型
*/
public class MessageImpl2 implements IMessage<String>{
@Override
public void print(String s) {
System.out.println(s);
}
public static void main(String[] args) {
//子类是泛型,子类产生对象时是什么类型,就是什么类型
IMessage<String> iMessage1 = new MessageImpl1<>();
iMessage1.print("NB!!!");
IMessage<Integer> iMessage2 = new MessageImpl1();
iMessage2.print(123);