我们借助《java核心技术卷一》中的例子,来看看泛型编程,在本书中有一个Pair的例子。
package tablejava;
class Pair<T>{
private T first;
private T second;
public Pair() {
this.first=null;
this.second=null;
}
public Pair(T first,T second) {
this.first=first;
this.second=second;
}
public T getFirst() {
return this.first;
}
public T getSecond() {
return this.second;
}
public void setFirst(T first) {
this.first=first;
}
public void setSecond(T second) {
this.second=second;
}
}
class Pair2<T,U>{
private T first;
private U second;
public Pair2() {
this.first=null;
this.second=null;
}
public Pair2(T first,U second) {
this.first=first;
this.second=second;
}
public T getFirst() {
return this.first;
}
public U getSecond() {
return this.second;
}
public void setFirst(T first) {
this.first=first;
}
public void setSecond(U second) {
this.second=second;
}
}
public class Generic {
public static void main(String[] args) {
Pair<String> pairstr=new Pair<String>();
pairstr.setFirst("hello ");
pairstr.setSecond("world");
System.out.println(pairstr.getFirst()+pairstr.getSecond());
Pair<Integer> pairint=new Pair<Integer>();
pairint.setFirst(1);//自动装箱
pairint.setSecond(2);//自动装箱
System.out.println(pairint.getFirst()+" "+pairint.getSecond());
Pair2<String,Integer> pair2=new Pair2<String,Integer>();
pair2.setFirst("hello");
pair2.setSecond(2);//自动装箱
System.out.println(pair2.getFirst()+" "+pair2.getSecond());
}
}
输出结果
hello world
1 2
hello 2
关于定界符,我们先定义几个类。
class ClassA{
}
class ClassB extends ClassA{
}
class ClassB1 extends ClassB{
}
class ClassB2 extends ClassB{
}
再定义一个Pair3类,定为继承自ClassB的类。
class Pair3< T extends ClassB>{
}
在来看看是否他的用法。
public class Generic2 {
public static void main(String []args) {
// Pair3<ClassA> pairx=new Pair3<ClassA>(); //报错
// Pair3<ClassB1> pair3=new Pair3<ClassB1>();//正确
Pair3<ClassB2> pair3=new Pair3<ClassB2>();//正确
}
}
?通配符
这一个通配符主要出现在方法的参数中。它代表着指向某个对象的满足某个条件的引用。
public class Generic2 {
public static void main(String []args) {
ClassA classa=new ClassA();
classa.setName("classa");
ClassB classb=new ClassB();
classb.setName("classb");
ClassB1 classb1=new ClassB1();
classb1.setName("classb1");
ClassB2 classb2=new ClassB2();
classb2.setName("classb2");
// Pair<ClassA> paira=new Pair<ClassA>();
// Pair<ClassB> pairb=new Pair<ClassB>();
Pair<ClassB1> pairb1=new Pair<ClassB1>();
Pair<ClassB2> pairb2=new Pair<ClassB2>();
pairb1.setFirst(classb1);
pairb1.setSecond(classb1);
pairb2.setFirst(classb2);
pairb2.setSecond(classb2);
//testMethod(paira);//报错
// testMethod(pairb);
testMethod(pairb1);
testMethod(pairb2);
}
public static void testMethod(Pair<? extends ClassB> pairb) {
System.out.println(pairb.getFirst().getName()+" and "+pairb.getSecond().getName());
}
}
运行结果
classb1 and classb1
classb2 and classb2