黑马程序员技术交流社区

标题: 关于泛型的疑问? [打印本页]

作者: Porsche911    时间: 2014-5-10 12:46
标题: 关于泛型的疑问?
  1. import java.util.*;

  2. class Person
  3. {
  4.      private String name;
  5.      private int age;
  6.      Person(String name, int age)
  7.      {
  8.           this.name = name;
  9.           this.age = age;
  10.      }

  11.      public int getAge()
  12.      {
  13.           return age;
  14.      }

  15.      public String toString()
  16.      {
  17.           return "name= "+name+'\t'+"age= "+age;
  18.      }
  19. }

  20. class Tools<T>
  21. {
  22.      public T getMaxAge(T t1, T t2)
  23.      {
  24.           return t1.getAge() > t2.getAge() ? t1 : t2;
  25.      }
  26. }

  27. class GenericDemo
  28. {
  29.      public static void main(String[] args)
  30.      {
  31.           Tools<Person> tools = new Tools<Person>();
  32.                
  33.           Person p1 = new Person("Jack", 32);
  34.           Person p2 = new Person("Kate", 18);
  35.           System.out.println(tools.getMaxAge(p1, p2));
  36.      }
  37. }
复制代码
只要已编译就会出现如下提示:
说是在类型为T的变量t1中找不到符号getAge(),T扩展已在类Tools中声明Object。
可我明明在创建Tools类时,指定了的泛型为Person,为什么还是无法调用t1,t2的特有方法呢?

错误提示.PNG (8.52 KB, 下载次数: 18)

错误提示

错误提示

作者: Yov正    时间: 2014-5-10 13:09
:) return ((Person) t1).getAge() > ((Person) t2).getAge() ? t1 : t2;
只有person和它的子类才有此方法,
作者: skill20    时间: 2014-5-10 13:11
  1. import java.util.*;

  2. class Person
  3. {
  4.      private String name;
  5.      private int age;
  6.      Person(String name, int age)
  7.      {
  8.           this.name = name;
  9.           this.age = age;
  10.      }

  11.      public int getAge()
  12.      {
  13.           return age;
  14.      }

  15.      public String toString()
  16.      {
  17.           return "name= "+name+'\t'+"age= "+age;
  18.      }
  19. }

  20. class Tools<T>
  21. {
  22.      public T getMaxAge(T t1, T t2)
  23.      {
  24.                  //这里你的泛型类型都不确定,你咋可以调用你指定类型的方法呢?
  25.                  // 泛型在某种程度上就相当与Object,不能用特有的方法。
  26.          // return t1.getAge() > t2.getAge()) ? t1 : t2;
  27.                  return t1.toString().compareTo(t2.toString()) > 0 ? t1: t2;
  28.      }
  29. }

  30. class GenericDemo
  31. {
  32.      public static void main(String[] args)
  33.      {
  34.           Tools<Person> tools = new Tools<Person>();
  35.                
  36.           Person p1 = new Person("Jack", 32);
  37.           Person p2 = new Person("Kate", 18);
  38.           System.out.println(tools.getMaxAge(p1, p2));
  39.      }
  40. }
复制代码

作者: ehuashao    时间: 2014-5-10 13:13
首先你的代码在编译的时候就出现问题,看这段代码:
  1. class Tools<T>
  2. {
  3.      public T getMaxAge(T t1, T t2)
  4.      {
  5.           return t1.getAge() > t2.getAge() ? t1 : t2;
  6.      }
  7. }
复制代码

在语法编译时,当你还没有new 出tools这个类时,也就是说现在的T还没有具体的类型,编译器读到t1.getAge()时,此时的T还是一个泛型,没有具体的类型,它怎么会有getAge这个方法呢。此时编译器就抛出错误了。
作者: lzhuas    时间: 2014-5-10 13:26
class Tools<T>
{
     public T getMaxAge(T t1, T t2)
     {
          return t1.getAge() > t2.getAge() ? t1 : t2;//设计泛型类的初衷是你以后传进来什么类型都管用,但你这个getAge方法是Person类所特有,编译肯定不通过。要用也可以,但return前必须强转成person类型。
     }
}


作者: Porsche911    时间: 2014-5-10 20:33
看了楼上几位同学的回答明白了问题的原因,也就说在编译阶段类型T还并未指定为哪种具体的类型,因此也就不可能调用相应的特有方法。

那么如果不用强转的方法,也不用继承其他类或者实现其他接口,该怎么调用T的特有方法呢?

网上说可以用反射的方法?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2