java泛型
来源:互联网 发布:围住神经猫html5 源码 编辑:程序博客网 时间:2024/05/19 09:12
java的参数化类型被称为泛型(顾名思义,类型用传入参数来确定)
泛型定义类:
只有定义方法时才可以使用数据形参,当调用方法时必须为数据形参传入实际的数据;与此类似,类,接口中的类型形参,只有在定义类,接口时才可以使用类型参数,当使用类,接口时应为类型形参传入实际的类型。
public class B<T extends Number>
public class Apple<T>
public class A extends Apple<T>{} 错误
public class A extends Apple<String> 正确
并不存在泛型类:
List<String> a=new ArrayList<String>();
List<Integer> b=new ArrayList<Integer>();
a.getClass()==b.getClass() // true
因此,类的静态变量和方法在所有实例间共享,所以在静态方法、静态初始化或者静态变量的声明或初始化不允许使用类型形参。
public class R<T>
{ //error
static T info;
T age;
public void foo(T msg){}
//error
public static void bar(T msg){}
}
注意:List<String> 不是List<Object>的子类。这就是为啥要有List<?>
类型通配符
前面定义一个类,类型不确定,使用泛型。现在定义一个方法,方法形参是不确定类型的类,例如传入List,具体List<String>,List<Integer>不定。
为了表示各种泛型List父类,我们使用?,称为通配符。可以匹配任何类型。将?作为类型实参传给List集合
public void test(List <?> c)
{ for(int i=0; i< c.size(); i++)
{ System.out.println(c.get(i));
}
}
但这种带有通配符List仅是父类,并不能把元素加入到其中,
List<?> c=new ArrayList<String>();
//error
c.add(new Object());
List<? extends Shape>
泛型方法
如果在定义类,接口没有使用类型形参,但定义方法时想自己定义类型形参,是可以的
static <T> void test(Collection<? extends T> a, Collection<T> c)
泛型方法和类型通配符的区别
对于形参T只使用一次,应该使用通配符,泛型方法允许表示方法参数间类型依赖关系,或者返回值类型与参数关系,如果没有这些关系,不应该使用泛型方法
如果有需要可以同时使用通配符和泛型方法:
public static <T> void copy(List<T> dest,List<? extends T> src){...}
改成泛型方法:
public static <T,S extends T> void copy(List<T> dest,List<S> src){...}
下限 Collection< ? super T>
- 【java 2】java泛型
- Java 泛型 Java generic
- Java Tutorials_Generics(java泛型)
- Java基础 Java 泛型
- java 泛型
- java泛型
- Java泛型
- Java泛型
- java泛型
- java泛型
- java泛型
- Java 泛型
- Java泛型
- Java 泛型
- JAVA 泛型
- java 泛型
- java泛型
- Java泛型
- 简单高效的nodejs爬虫模型
- Hibernate的参数绑定
- 输出年月日
- 多线程与timer
- unity安装与破解
- java泛型
- Google Testing on the Toilet系列---好的端对端测试是什么
- postgresql 安装教程
- 使用MySQL for Navicat 创建用户(连接) 及 SQL语句操作
- this 那家伙
- 【洛谷】P1554 梦中的统计
- memcpy函数
- 多线程编程
- MySQL优化必须调整的10项配置