正在学习泛型的相关知识,定义的一个MyGene<T>自定义数据容器类保存Person和其子类型,想定义个getLast方法获得容器中最后一个元素的值。但是方法的泛型返回值无法通过,具体错误如下:
*************************
TestGene2.java:4: 错误: 方法声明无效; 需要返回类型
public static <T extends Person> getLast(MyGene<T> mg){
                                 ^
1 个错误
*************************
高手请帮我看看,先谢了!!!import java.util.*;
class TestGene2 
{
public static <T extends Person> getLast(MyGene<T> mg){ //此行出问题,
return mg.get(mg.size()-1);
}
public static void main(String[] args) 
{
System.out.println("Hello World!");

MyGene<Person> mg1 = new MyGene<Person>();
mg1.add(new Person());
mg1.add(new Person("lisi"));
mg1.add(new Teacher("wangmazi","008"));
System.out.println(mg1);
MyGene<Teacher> mg2 = new MyGene<Teacher>();
mg2.add(new Teacher());
mg2.add(new Teacher("009"));
System.out.println(mg2);
}
}class MyGene<T extends Person>{
List<T>  al;
MyGene(){
 al= new ArrayList<T>(10);
}
MyGene(List<T> c){
al= new ArrayList<T>(c);
}
T get(int index){
return al.get(index);
   }
   void add(T item){
   al.add(item);
   }
   void set(int index, T item){
al.set(index,item);
   }
  public String toString(){
   String str="";
   str+="[";
for (T ele : al){
str += ele.toString()+", ";
}
str+="]";
return str;
   }
}class Person{
String name;
Person(){
name = "zhangsan";
}
Person(String n){
name = n;
}
public String toString(){
return name;
}
}
class Teacher extends Person{
String hireNo;
Teacher(){
hireNo="007";
}
Teacher(String hn){
super();
hireNo =hn;
}
Teacher(String n, String hn){
super(n);
hireNo =hn;
}
public String toString(){
return super.toString()+":"+ hireNo;
}
}

解决方案 »

  1.   

    报错说你的方法返回值无效是对的
    public static <T extends Person> getLast(MyGene<T> mg){ //此行出问题你这个方法的方法签名都不完整,你的方法没有定义返回值。前面的泛型代表的不是返回值,这是一个泛型方法,代表在此方法中T就是你定义的泛型
      

  2.   

    public static <T extends Person>  T getLast(MyGene<T> mg)<T extends Person>只是在声明泛型类型,并不是声明方法的返回值,所以需要在 getLast前加上个  T
      

  3.   

    多谢楼上两位的解释,泛型定义在方法上的<T extends Person>的类型形参,应该后面跟上返回值,已经理解,谢谢!
      

  4.   


    既然是泛型,个人觉得没必要定义这么复杂的类型形参,直接public static <T >  T getLast(MyGene<T> mg),因为最终你都需要强制转换为你需要的类型。