泛型的问题。

SilentHunter460 2020-04-20 04:46:10
下面的代码中,public void feed(objType p)方法里的p.name和p.eat()不对,请问要怎么改?
p.name目的是调用Pet类的name数据,p.eat()目的是调用Dog类的eat方法,但是现在用泛型了,eclipse无法提前知道我将使用哪个对象类型,自然就不认识这两个东西。


public class test4 {
public static void main(String[] args) {
Master<Pet> zhangSan = new Master<Pet>("张三");
Pet dog = new Dog();
zhangSan.feed(dog);
}
}

class Master<objType>{
private String name;

public Master() {

}

public Master(String name) {
this.name = name;
}

public void setName(String name) {
this.name = name;
}

public String getName() {
return this.name;
}

public void feed(objType p) {
System.out.println(this.name + "正在给" + p.name + "喂食");
p.eat();
}
}

abstract class Pet {
String name;

public abstract void eat();

}

class Dog extends Pet {
private final String name = "狗";

public Dog() {
super.name = name;
}

@Override
public void eat() {
System.out.println(name + "正在吃东西。" + "\n");
}
}
...全文
196 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2020-04-21
  • 打赏
  • 举报
回复
个人觉得一般泛用和反射是结合起来用才能到达效果。单独把泛用拿出来确实感觉意义不是很大。
qq_39936465 2020-04-21
  • 打赏
  • 举报
回复
引用 楼主 qq_16774199 的回复:
下面的代码中,public void feed(objType p)方法里的p.name和p.eat()不对,请问要怎么改? p.name目的是调用Pet类的name数据,p.eat()目的是调用Dog类的eat方法,但是现在用泛型了,eclipse无法提前知道我将使用哪个对象类型,自然就不认识这两个东西。
直接引用泛用型是不行的,因为不知道是那个类型无法调用该变量,楼上的方法可以。用下面的转换也可以。

 public void feed(objType p) {
    	Pet pet=(Pet)p;
        System.out.println(this.name + "正在给" +pet.name + "喂食");
        pet.eat();
    }
qybao 2020-04-20
  • 打赏
  • 举报
回复
引用 7 楼 qq_16774199 的回复:
我正在学习多态,基本知道泛型代码怎么写了。但还没体会出泛型的意义,好像没什么是Object不能解决的。

Object有时候是能解决问题,但是不能事先在编译期检测类型是否匹配(要在运行期才会抛出异常),会给程序带来隐患,如下
List<Object> list = new ArrayList<>();
list.add("abc");
Integer n = (Integer)list.get(0);
编译不会出错,但运行会出错

而且如果list.add("abc");和Integer n = (Integer)list.get(0); 分别放在两个不相干的函数中使用,那你要追踪错误更是费老大劲了,所以人们就会想想方案,能不能出现这样的代码就让编译器在编译的时候自动报错,而泛型能达到类型检测的目的,如
List<String> list = new ArrayList<>();
list.add("abc");
Integer n = (Integer)list.get(0); //这里就会编译错误




SilentHunter460 2020-04-20
  • 打赏
  • 举报
回复
引用 6 楼 qybao的回复:
[quote=引用 5 楼 qq_16774199 的回复:]

也就是说我的例子不能也没必要用泛型对吧?直接public void feed(Pet p)多好。

那就要看你想达到什么目的了,就好比用Object参数代替泛型一样

[/quote] 我正在学习泛型,基本知道泛型代码怎么写了。但还没体会出泛型的意义,好像没什么是Object不能解决的。
SilentHunter460 2020-04-20
  • 打赏
  • 举报
回复
引用 6 楼 qybao的回复:
[quote=引用 5 楼 qq_16774199 的回复:]

也就是说我的例子不能也没必要用泛型对吧?直接public void feed(Pet p)多好。

那就要看你想达到什么目的了,就好比用Object参数代替泛型一样

[/quote] 我正在学习多态,基本知道泛型代码怎么写了。但还没体会出泛型的意义,好像没什么是Object不能解决的。
qybao 2020-04-20
  • 打赏
  • 举报
回复
引用 5 楼 qq_16774199 的回复:
也就是说我的例子不能也没必要用泛型对吧?直接public void feed(Pet p)多好。

那就要看你想达到什么目的了,就好比用Object参数代替泛型一样

SilentHunter460 2020-04-20
  • 打赏
  • 举报
回复
引用 4 楼 qybao 的回复:
[quote=引用 2 楼 qq_16774199 的回复:] [ 你好,谢谢回复。 泛型就是为了接受任何类型对象,现在搞成必须是Pet的子类对象,那不如用多态,直接改为public void feed(Pet p)。
你错了,泛型虽然是任何类型,但你的方法里用到了Pet的方法,所以如果不是Pet的子类,调用方法就会出错[/quote] 也就是说我的例子不能也没必要用泛型对吧?直接public void feed(Pet p)多好。
qybao 2020-04-20
  • 打赏
  • 举报
回复
引用 2 楼 qq_16774199 的回复:
[

你好,谢谢回复。
泛型就是为了接受任何类型对象,现在搞成必须是Pet的子类对象,那不如用多态,直接改为public void feed(Pet p)。

你错了,泛型虽然是任何类型,但你的方法里用到了Pet的方法,所以如果不是Pet的子类,调用方法就会出错
qybao 2020-04-20
  • 打赏
  • 举报
回复
方法1, 如LS所说
方法2,还可以把参数强行转换
    public void feed(objType p) {
if (p instanceOf Pet) {
System.out.println(this.name + "正在给" + ((Pet)p).name + "喂食");
((Pet)p).eat();
}
}
SilentHunter460 2020-04-20
  • 打赏
  • 举报
回复
引用 1 楼 kse_music 的回复:
把class Master<objType> 改成 class Master<objType extends Pet>
你好,谢谢回复。 泛型就是为了接受任何类型对象,现在搞成必须是Pet的子类对象,那不如用多态,直接改为public void feed(Pet p)。
kse_music 2020-04-20
  • 打赏
  • 举报
回复
把class Master<objType> 改成 class Master<objType extends Pet>

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧