------- android培训、java培训、期待与您交流! ----------
黑马程序员----泛形
为了创建可以按类型进行参数化的类,把类型参数作为使用参数类型时指定的类型占位符的一种表现能力。
好处:
通过限定添加类型,保证类型的安全。
消除强制类型的转换的麻烦。
提高的维护性;
使用:
声明带泛型的类:
class 类名<泛型类型1,泛型类型2……>
{
泛型类型 变量名;
泛型类型 方法名(){}
返回值类型 方法名(泛型类型 变量名){}
}
使用带泛型的类:
类名<具体类> 对象名 =new 类名<具体类>();
Eg:
public class demo<Q> //声明任意符号的标识符
{
private Q x; //变量类型由外部组成
private Q y;
public Q getX()
{
return x;
}
public void setX(Q x)//类型由外部决定
{
this.x = x;
}
}
Public static void main(String Args[])
{
demo<String> d =new demo<String >(); //定义具体类型,明确是装什么类型,保证类型安全。
d.setX(“第一个”);
d.setY(“另外一个”); //此时就能保证集合里元素类型一致
String x=d.getX();
demo<Double> d =new demo<Double >(); //定义具体类型,避免强转。 d.setX(“1.3”);
d.setY(“2.3”);
Double x=d.getY();
}
声明泛型接口:
Eg:
public interface inter<T>{}
实现接口:
public class imp<T>implements inter<T>{}
public class imp implements iter<Integer>{}
声明泛型方法
格式:
<泛型标签> 返回值类型方法名([泛型标签 参数]...)
Eg: public static <T > List<T> add(T t){}
声明多个泛型类型:
只要在声明类的时候指定多个泛型类型即可
Eg:
Public abstract class duo<K,V>
{
abstract swap(K k,V v);
V get(K k);
}
泛型的上限与下限
当参数类型只能是目标类型或其子类时:
声明对象:类名<? extends 类> 对象名
定义类:类名<泛型标签 extends 类>{}
Eg:public static void add(List<? extendsNumber> l){}
add(1);
add(1.6);
add(“1.222”);//错误。
当参数类型只能是该类型或该类型的父类:
声明对象:类名<? super 类> 对象名称
定义类:类名<泛型标签 extends类>{}
Eg:public static void add(List<? superString> l){}
add(”字符串”);
add(new object());
add(1);//错误。
其中 ?是通配符,表示未知类型的泛型对象,即接受任意类型,当类型不确定的时候不能被使用。
Eg:List<?> list = new ArrayList<>();list.add(10);//?未确定,不能被使用。
泛型的嵌套:
经常见于与Map的运用的时候。
Map<Integer, String> m= new TreeMap<Integer, String>();
Set<Entry<Integer, String>>s = m.entrySet();
Iterator<Entry<Integer,String>> it = s.iterator();
while(it.hasNext())
{
Entry<Integer, String> e = it.next();//用泛型消强转。
System.out.println(e.getKey()+e.getValue());
}