黑马程序员技术交流社区

标题: 为什么会在t.getName()出编译错误,求大神伸腿 [打印本页]

作者: JavaProgrammer    时间: 2015-9-6 15:58
标题: 为什么会在t.getName()出编译错误,求大神伸腿
import java.util.*;
class Generc_Text {
        public static void main(String[] args){
                Utils<Person> u = new Utils<Person>();
                Person p =new Person("张三",23);
                u.println(p);
        }
}
class  Utils<T>{
        public void println(T t){
                System.out.println(t.getName());
        }
        public <Y> void show(Y y){
                System.out.println(y);
        }
}

class Person {
        private String name;
        private int age;
        Person(String name,int age){
                this.name = name;
                this.age = age;
        }
        public void setName(String name){
                this.name = name;
        }
        public String getName(){
                return name;
        }
        public void setAge(int age){
                this.age = age;
        }
        public int getAge(){
                return age;
        }
}
作者: asinzuo    时间: 2015-9-6 18:57
你这题涉及泛型知识,泛型里就要注意类型转型的问题。

class  Utils<T>这里声明的是接收Object型参数,

public void println(T t){
                System.out.println(t.getName());
        }

这里的t  Object型对象,obj里当然没有getName()方法。

你想调用的是Perosn的getName()方法,那么要将t向下转型

改成: System.out.println(((Person) t).getName());  即可
作者: asinzuo    时间: 2015-9-6 19:15
比较合理的一种方法:加个判断public void println(T t){
                        if(t instanceof Person)
                System.out.println(((Person) t).getName());

        }

20150906191041.jpg (74.04 KB, 下载次数: 12)

20150906191041.jpg

作者: asinzuo    时间: 2015-9-6 19:18
正规的方法应该这样
public void println(T t){
                        if(t instanceof Person)
                        {
                                Person per = (Person) t;
                                System.out.println(per.getName());
                        }
               
        }




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