一篇代码胜过千言万语
package com.apkkids.javalanguage;
import java.util.ArrayList;
import java.util.List;
/**
* @author wxb
* Java泛型例子
*/
public class GenericTest {
//泛型接口
public interface MyCollection<T>{
public T get(int position );
public T add(T t);
}
//泛型接口继承
public interface MyList<T> extends MyCollection<T>{}
//泛型类
public static class MyListImpl<T> implements MyList<T>{
public T get(int position) {
System.out.println("get value at position "+ position);
return null;
}
public T add(T t) {
System.out.println("add "+t.toString());
return null;
}
}
//要用到的一组类
public static class Fruit{}
public static class Apple extends Fruit{}
public static class Strawberry extends Fruit{}
public static class FujiApple extends Apple{}
/**
* @param args
*/
public static void main(String[] args) {
//实例化泛型类
MyList<String> strlist = new MyListImpl<String>();
strlist.add("test");
strlist.get(0);
//下面的代码说明:List<Apple>不是List<Fruit>的子类,用更通俗的话,泛型类型跟其是否子类型没有任何关系。
// List<Apple> apples = new ArrayList<Apple>();
// List<Fruit> fruits = apples;
// 使用 ? extends 通配符,List<Apple>和List<Strawberry>的对象都可以赋值给List<? extends Fruit>
List<Apple> apples = new ArrayList<Apple>();
List<Strawberry> strawberrys = new ArrayList<Strawberry>();
List<? extends Fruit> fruits = apples;
fruits = strawberrys;
//使用 ? super 通配符,List<Fruit>的对象可以赋值给List<? super Apple>
List<Fruit> fruits2 = new ArrayList<Fruit>();
List<? super Apple> apples2 = fruits2;
// 总结 ? extends 和 the ? super 通配符的特征,我们可以得出以下结论:
// 1.如果你想从一个数据类型里获取数据,使用 ? extends 通配符
fruits.get(0);
//下面三行都会编译报错
// fruits.add(new Apple());
// fruits.add(new Strawberry());
// fruits.add(new Fruit());
// 2.如果你想把对象写入一个数据结构里,使用 ? super 通配符
apples2.add(new Apple());
apples2.add(new FujiApple());
Object o = apples2.get(0); //取出时只能得到Obejct对象
// 3.如果你既想存,又想取,那就别用通配符。
}
}
原文地址:http://blog.csdn.net/logicteamleader/article/details/46523685