标签:泛型 java
概念:
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。
泛型的常用字符代表意思:
? 表示不确定的java类型。
T 表示java类型。
K V 分别代表java键值中的Key Value。
E 代表Element。
下面转载于cnblog上一个写的很好的例子
真的很好,我写了半天,当看到他这个后,立即删除~
普通泛型
-
class Point<T>{
-
private T var ;
-
public T getVar(){
-
return var ;
-
}
-
public void setVar(T var){
-
this.var = var ;
-
}
-
};
-
public class GenericsDemo06{
-
public static void main(String args[]){
-
Point<String> p = new Point<String>() ;
-
p.setVar("it") ;
-
System.out.println(p.getVar().length()) ;
-
}
-
};
-
----------------------------------------------------------
-
class Notepad<K,V>{
-
private K key ;
-
private V value ;
-
public K getKey(){
-
return this.key ;
-
}
-
public V getValue(){
-
return this.value ;
-
}
-
public void setKey(K key){
-
this.key = key ;
-
}
-
public void setValue(V value){
-
this.value = value ;
-
}
-
};
-
public class GenericsDemo09{
-
public static void main(String args[]){
-
Notepad<String,Integer> t = null ;
-
t = new Notepad<String,Integer>() ;
-
t.setKey("汤姆") ;
-
t.setValue(20) ;
-
System.out.print("姓名;" + t.getKey()) ;
-
System.out.print(",年龄;" + t.getValue()) ;
-
-
}
-
};
通配符
-
class Info<T>{
-
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 GenericsDemo14{
-
public static void main(String args[]){
-
Info<String> i = new Info<String>() ;
-
i.setVar("it") ;
-
fun(i) ;
-
}
-
public static void fun(Info<?> temp){
-
System.out.println("内容:" + temp) ;
-
}
-
};
受限泛型
-
class Info<T>{
-
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 GenericsDemo17{
-
public static void main(String args[]){
-
Info<Integer> i1 = new Info<Integer>() ;
-
Info<Float> i2 = new Info<Float>() ;
-
i1.setVar(30) ;
-
i2.setVar(30.1f) ;
-
fun(i1) ;
-
fun(i2) ;
-
}
-
public static void fun(Info<? extends Number> temp){
-
System.out.print(temp + "、") ;
-
}
-
};
-
----------------------------------------------------------
-
class Info<T>{
-
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<String> i1 = new Info<String>() ;
-
Info<Object> i2 = new Info<Object>() ;
-
i1.setVar("hello") ;
-
i2.setVar(new Object()) ;
-
fun(i1) ;
-
fun(i2) ;
-
}
-
public static void fun(Info<? super String> temp){
-
System.out.print(temp + "、") ;
-
}
-
};
泛型无法向上转型
-
class Info<T>{
-
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 GenericsDemo23{
-
public static void main(String args[]){
-
Info<String> i1 = new Info<String>() ;
-
Info<Object> i2 = null ;
-
i2 = i1 ;
-
}
-
};
泛型接口
-
interface Info<T>{
-
public T getVar() ;
-
}
-
class InfoImpl<T> implements Info<T>{
-
private T var ;
-
public InfoImpl(T var){
-
this.setVar(var) ;
-
}
-
public void setVar(T var){
-
this.var = var ;
-
}
-
public T getVar(){
-
return this.var ;
-
}
-
};
-
public class GenericsDemo24{
-
public static void main(String arsg[]){
-
Info<String> i = null;
-
i = new InfoImpl<String>("汤姆") ;
-
System.out.println("内容:" + i.getVar()) ;
-
}
-
};
-
----------------------------------------------------------
-
interface Info<T>{
-
public T getVar() ;
-
}
-
class InfoImpl implements Info<String>{
-
private String var ;
-
public InfoImpl(String var){
-
this.setVar(var) ;
-
}
-
public void setVar(String var){
-
this.var = var ;
-
}
-
public String getVar(){
-
return this.var ;
-
}
-
};
-
public class GenericsDemo25{
-
public static void main(String arsg[]){
-
Info i = null;
-
i = new InfoImpl("汤姆") ;
-
System.out.println("内容:" + i.getVar()) ;
-
}
-
};
泛型方法
-
class Demo{
-
public <T> T fun(T t){
-
return t ;
-
}
-
};
-
public class GenericsDemo26{
-
public static void main(String args[]){
-
Demo d = new Demo() ;
-
String str = d.fun("汤姆") ;
-
int i = d.fun(30) ;
-
System.out.println(str) ;
-
System.out.println(i) ;
-
}
-
};
通过泛型方法返回泛型类型实例
-
class Info<T extends Number>{
-
private T var ;
-
public T getVar(){
-
return this.var ;
-
}
-
public void setVar(T var){
-
this.var = var ;
-
}
-
public String toString(){
-
return this.var.toString() ;
-
}
-
};
-
public class GenericsDemo27{
-
public static void main(String args[]){
-
Info<Integer> i = fun(30) ;
-
System.out.println(i.getVar()) ;
-
}
-
public static <T extends Number> Info<T> fun(T param){
-
Info<T> temp = new Info<T>() ;
-
temp.setVar(param) ;
-
return temp ;
-
}
-
};
使用泛型统一传入的参数类型
-
class Info<T>{
-
private T var ;
-
public T getVar(){
-
return this.var ;
-
}
-
public void setVar(T var){
-
this.var = var ;
-
}
-
public String toString(){
-
return this.var.toString() ;
-
}
-
};
-
public class GenericsDemo28{
-
public static void main(String args[]){
-
Info<String> i1 = new Info<String>() ;
-
Info<String> i2 = new Info<String>() ;
-
i1.setVar("HELLO") ;
-
i2.setVar("汤姆") ;
-
add(i1,i2) ;
-
}
-
public static <T> void add(Info<T> i1,Info<T> i2){
-
System.out.println(i1.getVar() + " " + i2.getVar()) ;
-
}
-
};
泛型数组
-
public class GenericsDemo30{
-
public static void main(String args[]){
-
Integer i[] = fun1(1,2,3,4,5,6) ;
-
fun2(i) ;
-
}
-
public static <T> T[] fun1(T...arg){
-
return arg ;
-
}
-
public static <T> void fun2(T param[]){
-
System.out.print("接收泛型数组:") ;
-
for(T t:param){
-
System.out.print(t + "、") ;
-
}
-
}
-
};
泛型的嵌套设置
-
class Info<T,V>{
-
private T var ;
-
private V value ;
-
public Info(T var,V value){
-
this.setVar(var) ;
-
this.setValue(value) ;
-
}
-
public void setVar(T var){
-
this.var = var ;
-
}
-
public void setValue(V value){
-
this.value = value ;
-
}
-
public T getVar(){
-
return this.var ;
-
}
-
public V getValue(){
-
return this.value ;
-
}
-
};
-
class Demo<S>{
-
private S info ;
-
public Demo(S info){
-
this.setInfo(info) ;
-
}
-
public void setInfo(S info){
-
this.info = info ;
-
}
-
public S getInfo(){
-
return this.info ;
-
}
-
};
-
public class GenericsDemo31{
-
public static void main(String args[]){
-
Demo<Info<String,Integer>> d = null ;
-
Info<String,Integer> i = null ;
-
i = new Info<String,Integer>("汤姆",30) ;
-
d = new Demo<Info<String,Integer>>(i) ;
-
System.out.println("内容一:" + d.getInfo().getVar()) ;
-
System.out.println("内容二:" + d.getInfo().getValue()) ;
-
}
-
};
泛型的擦除
因为类型擦除的问题,所以所有的泛型类型变量最后都会被替换为原始类型。这样就引起了一个问题,既然都被替换为原始类型,那么为什么我们在获取的时候,不需要进行强制类型转换呢?看下ArrayList和get方法:
public E get(int index) {
RangeCheck(index);
return (E) elementData[index];
}
看以看到,在return之前,会根据泛型变量进行强转。假设泛型类型变量为Date,虽然泛型信息会被擦除掉,但是会将(E) elementData[index],编译为(Date)elementData[index]。所以我们不用自己进行强转。
泛型中<? extends T>和<? super T> 差别
<? extends T>和<? super T>含有JAVA5.0的新的概念。由于它们的外表导致了很多人误解了它们的用途:
1.<? extends T>
首先你很容易误解它为继承于T的所有类的集合,这是大错特错的。
相信能看下去你一定见过或用过List<? extends T>吧?为什么我说理解成一个集合是错呢?如果理解成一个集合那为什么不用List<T>来表示?所以<? extends T>不是一个集合,而是T的某一种子类的意思,记住是一种,单一的一种,问题来了,由于连哪一种都不确定,带来了不确定性,所以是不可能通过 add()来加入元素。你或许还觉得为什么add(T)不行?因为<? extends
T>是T的某种子类,能放入子类的容器不一定放入超类,也就是没可能放入T。
2.<? super T>
这里比较容易使用,没<? extends T>这么多限制,这里的意思是,以T类为下限的某种类,简单地说就是T类的超类。但为什么add(T)可以呢?因为能放入某一类的容器一定可以放入其子类,多态的概念。
JAVA基础—泛型小结,布布扣,bubuko.com
JAVA基础—泛型小结
标签:泛型 java
原文地址:http://blog.csdn.net/zhao9tian/article/details/38448875