private static int add(int a, int b) {
System.out.println(a + "+" + b + "=" + (a + b));
return a + b;
}
private static float add(float a, float b) {
System.out.println(a + "+" + b + "=" + (a + b));
return a + b;
}
private static double add(double a, double b) {
System.out.println(a + "+" + b + "=" + (a + b));
return a + b;
}
如果没有泛型,要实现不同类型的加法,每种类型都需要重载一个add方法;
引入泛型,我们可以复用为一个方法:
private static double add(T a, T b) {
System.out.println(a + "+" + b + "=" + (a.doublevalue() + b.doublevalue()));
return a.doublevalue() + b.doublevalue();
}
2、不需要强制类型转换。泛型中的类型在使用时指定(类型安全,编译器会检查类型)
List list = new ArrayList();
list.add("xstring");
list.add(1000);
list.add(new Person());
// list中只能放String, 不能放其它类型的元素
List list = new ArrayList();
三:泛型使用 1、泛型类
class Point{ // 此处可以随便写标识符号,T是type的简称
private T var ; // var的类型由T指定,即:由外部指定
public T getVar(){ // 返回值的类型由外部决定
return var ;
}
public void setVar(T var){ // 设置的类型也由外部决定
this.var = var ;
}
}
2、泛型接口
interface Info{ // 在接口上定义泛型
public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型
}
class InfoImpl implements Info{ // 定义泛型接口的子类
private T var ; // 定义属性
public InfoImpl(T var){ // 通过构造方法设置属性内容
this.setVar(var) ;
}
public void setVar(T var){
this.var = var ;
}
public T getVar(){
return this.var ;
}
}
//上限
class Info{ // 此处泛型只能是数字类型
private T var ; // 定义泛型变量
public void setVar(T var){
this.var = var ;
}
public T getVar(){
return this.var ;
}
public String toString(){ // 直接打印
return this.var.toString() ;
}
}
public class demo1{
public static void main(String args[]){
Info i1 = new Info() ; // 声明Integer的泛型对象
}
}
//下限
class Info{
private T var ; // 定义泛型变量
public void setVar(T var){
this.var = var ;
}
public T getVar(){
return this.var ;
}
public String toString(){ // 直接打印
return this.var.toString() ;
}
}
public class GenericsDemo21{
public static void main(String args[]){
Info i1 = new Info() ; // 声明String的泛型对象
Info
消除类型参数声明,即删除<>及其包围的部分。替换所有的类型参数为原生态类型,即根据类型参数的上下界推断,如果类型参数是无限制通配符或没有上下界限定则替换为Object,如果存在上下界限定则替换为类型参数的上界或者下界,比如形如和 extends Number>的类型参数被替换为Number, super Number>被替换为Object。为了保证类型安全,必要时插入强制类型转换代码通过“桥接方法”以保证擦除类型后的代码仍然具有泛型的“多态性”
因为在 Java 编译期没法确定泛型参数化类型,也就找不到对应的类字节码文件,所以自然就不行了,此外由于T 被擦除为 Object,如果可以 new T() 则就变成了 new Object(),失去了本意。
如果我们确实需要实例化一个泛型,应该如何做呢?可以通过反射实现:
static T newTclass (Class < T > clazz) throws InstantiationException, IllegalAccessException {
T obj = clazz.newInstance();
return obj;
}
9、泛型数组:能不能采用具体的泛型类型进行初始化?
List[] lsa = new List[10]; // Not really allowed.
Object o = lsa;
Object[] oa = (Object[]) o;
List li = new ArrayList();
li.add(new Integer(3));
oa[1] = li; // Unsound, but passes run time store check
String s = lsa[1].get(0); // Run-time error ClassCastException.