黑马程序员技术交流社区
标题:
关于泛型的疑问?
[打印本页]
作者:
Porsche911
时间:
2014-5-10 12:46
标题:
关于泛型的疑问?
import java.util.*;
class Person
{
private String name;
private int age;
Person(String name, int age)
{
this.name = name;
this.age = age;
}
public int getAge()
{
return age;
}
public String toString()
{
return "name= "+name+'\t'+"age= "+age;
}
}
class Tools<T>
{
public T getMaxAge(T t1, T t2)
{
return t1.getAge() > t2.getAge() ? t1 : t2;
}
}
class GenericDemo
{
public static void main(String[] args)
{
Tools<Person> tools = new Tools<Person>();
Person p1 = new Person("Jack", 32);
Person p2 = new Person("Kate", 18);
System.out.println(tools.getMaxAge(p1, p2));
}
}
复制代码
只要已编译就会出现如下提示:
说是在类型为T的变量t1中找不到符号getAge(),T扩展已在类Tools中声明Object。
可我明明在创建Tools类时,指定了的泛型为Person,为什么还是无法调用t1,t2的特有方法呢?
错误提示.PNG
(8.52 KB, 下载次数: 18)
下载附件
2014-5-10 12:41 上传
错误提示
作者:
Yov正
时间:
2014-5-10 13:09
:) return ((Person) t1).getAge() > ((Person) t2).getAge() ? t1 : t2;
只有person和它的子类才有此方法,
作者:
skill20
时间:
2014-5-10 13:11
import java.util.*;
class Person
{
private String name;
private int age;
Person(String name, int age)
{
this.name = name;
this.age = age;
}
public int getAge()
{
return age;
}
public String toString()
{
return "name= "+name+'\t'+"age= "+age;
}
}
class Tools<T>
{
public T getMaxAge(T t1, T t2)
{
//这里你的泛型类型都不确定,你咋可以调用你指定类型的方法呢?
// 泛型在某种程度上就相当与Object,不能用特有的方法。
// return t1.getAge() > t2.getAge()) ? t1 : t2;
return t1.toString().compareTo(t2.toString()) > 0 ? t1: t2;
}
}
class GenericDemo
{
public static void main(String[] args)
{
Tools<Person> tools = new Tools<Person>();
Person p1 = new Person("Jack", 32);
Person p2 = new Person("Kate", 18);
System.out.println(tools.getMaxAge(p1, p2));
}
}
复制代码
作者:
ehuashao
时间:
2014-5-10 13:13
首先你的代码在编译的时候就出现问题,看这段代码:
class Tools<T>
{
public T getMaxAge(T t1, T t2)
{
return t1.getAge() > t2.getAge() ? t1 : t2;
}
}
复制代码
在语法编译时,当你还没有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