/***一、下面几个类和接口的关系是为了后面的Demo1类示例作准备 **/
interface inf1 {
}
interface inf2 {
}
class Animal {
}
class Person extends Animal {
}
class Girl extends Person {
}
class GoodGirl extends Girl {
}
class Man extends Person implements inf1, inf2 {
}
/**
* 二、方法泛型的示例
* E:任意类或接口
*/
public class Demo1<E> {
/** T:E类或E的子类,E接口或E接口实现类 */
public <T extends E> T fun1(T t) {
return t;
}
/*** T: 任意类或接口 */
public <T> T fun2(T t) {
return t;
}
/***T: Animal类(及其子类)并且必须是inf1接口(及其实现类)*/
/***K: inf2接口(及其实现类) */
public <T extends Animal,inf1, K extends inf2> void show(T t, K k) {
System.out.println(t+":"+k);
}
public String getMiddle(String[] a) {
System.out.println("no");
return "no";
}
/***T:任意类或接口*/
public <T> T getMiddle(T[] a) {
System.out.println("yes");
return a[a.length/2];
}
/***调用函数时可以带泛型,也可以不带*/
public static void main(String[] args) {
/***E:Person */
Demo1<Person> d = new Demo1<Person>();
/***fun1中的T: Person或Person的子类,所以fun1中的参数必须是Person或Person的子类对象*/
d.fun1(new GoodGirl());
/***调用fun1时使用了泛型Person(必须是E类或E类的的实现类,
而前面Demo1<Person>规定了E为Person,所以这里可以指定Person类) */
d.<Person>fun1(new Girl());/**参数可以是Person及其子类对象*/
/***调用fun1时使用了泛型Girl(必须是E类或E类的的实现类,
而前面Demo1<Person>规定了E为Person,所以这里可以指定Girl类) */
d.<Girl>fun1(new Girl());/**参数可以是Girl及其子类的对象*/
String[] names = {"1","2","3"};
/***没有使用泛型调用,调用到public String getMiddle(String[] a)*/
d.getMiddle(names);
/***使用了泛型调用,调用到public <T> T getMiddle(T[] a),*/
d.<String>getMiddle(names);
}
}