1.泛型是主要目的就是指定容器要持有什么类型的对象,而且由编译器来保证类型的正确性。需要使用类型参数,用尖括号括住,放在类名后面。然后在使用参数的时候,再用实际的类型来替换此类型参数。基本类型是无法作为类型参数来使用的,java的类型参数必须是对象类型。
参考代码
public class test1<T>
{
private T a;
public test1(T a)
{
this.a=a;
}
public T f()
{
return a;
}
public static void main(String[] args)
{
test1<String> base=new test1<String>("2");
System.out.print(base.f());
}
}
2.泛型方法
使用泛型类时,必须在创建对象的时候指出具体的类型,而使用泛型方法通常不必指明参数类型,因为编译器为我们找出具体的类型,这个称为参数推断。
要定义泛型方法,只需要将泛型参数列表置于返回值之前。
public class test1
{
public <T> void f(T x)
{
System.out.println(x.getClass().getName());
}
public static void main(String[] args)
{
test1 tt=new test1();
tt.f("");
tt.f(1);
tt.f(1.0);
}
}
输出
java.lang.String
java.lang.Integer
java.lang.Double
3.擦除
class HasF {
public void f()
{
System.out.print("sssssss");
}
}
class Manipulator<T extends HasF>{
private T obj;
public Manipulator(T x){
obj=x;
}
public void manipulate()
{
obj.f();
}
}
public class Mani{
public static void main(String [] args)
{
HasF hf=new HasF();
Manipulator<HasF> tt=new Manipulator<HasF>(hf);
tt.manipulate();
}
在<T extends HasF>声明T必须具有类型HasF或者从HasF导出的类型,这样才可以安全在obj上调用发f()了,没有这个申明manipulator()不能在obj上调用f()这一需求映射到HasF拥有f()这个方法上面