【原】Java5 新特性3——泛型

泛型是指一个类或方法被设计得可以适应多种不同的情况,例如, 运行时才能知道的类型。
泛型在类型安全实在编译期得以保证的, 在运行时泛型依然是使用Object对象实现的, 但是编译器帮我们进行类型安全的保证和自动的类型转换。

泛型类:

class GenericClass<T1, T2>
{
         public GenericClass(T1 t1, T2, t2)
         {
                       System.out.println("t1的类型: " + t1.getClass().getName() + "\n" + "t2 的类型:" +                    t2.getClass().getName());
         }
}

泛型方法:

public <T1, T2> T1 genericMethod(T1 t11, T1, t22, T2 t2)
{
             System.out.println("t11 的类型:" + t11.getClass().getName());
             System.out.println("t11 的类型:" + t11.getClass().getName());
             System.out.println("t11 的类型:" + t11.getClass().getName());
}

注意, 在泛型中用同一个类型参数表示的类型不一定要是相同的, 但是如果要使用一个变量记录方法的返回值, 则编译器会将使用相同类型参数的变量转换成相同的类型(如都转换为他们的父类)再代入方法。
如:

public class Test {
public static void main(String[] args) {
System.out.println(new Test().genericMethod(new c1(), new c2()).getClass().getName());
 //	c1 c = new Test().genericMethod(new c1(), new c2()); 错误: Type mismatch: cannot convert from c0 to c1
c0 c = new Test().genericMethod(new c1(), new c2());
}
 
public <T> T genericMethod(T instan, T other)
{
System.out.println(instan.getClass().getName());
System.out.println(other.getClass().getName());
return instan;
}
}
class c0
{
}
class c1 extends c0
{
}
class c2 extends c0
{
}

同时, 泛型还可以对类型参数代表的类型进行限定, 进行限定后可以使用传入的参数中的字段和方法

public <T extends String & Number & MyClass> T genericMethod(T myclass)
{
System.out.println(myclass.value);
}
class MyClass
{
int value = 10;
}

此时T所代表的类型只能是 String, Number, MyClass, 或他们的子类

此条目发表在 Java 分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>