如何在向下转换后访问基类方法?

时间:2014-03-01 20:35:36

标签: java oop

这是一个Java Generics程序,它使用set(T t),get()和print(T t)方法实现自定义接口。

我使用的类名为Animal。它需要一个T参数(在本例中为String)并为动物命名。

我的问题是我无法访问打印功能中的任何Animal类方法。

Animal<String> a1 = new Animal();
a1.set("Mickey");

public void print(Object o) {
  Animal oAnimal = (Animal) o; //Downcasting from Object to Animal.

  System.out.println(o.get()); //not accessible, and I don't know how to make it accessible.
//I can only access the methods from Object, not my custom class called Animal.
}

2 个答案:

答案 0 :(得分:9)

你应该使用

oAnimal.get()

因为那是Animal的实例。

请记住,您没有修改o,因此它将保留为Object

答案 1 :(得分:8)

问题是你仍然试图在o上调用方法,它仍然是类型Object(就变量的编译时类型而言,这就是全部编译器关心)。

如果你在oAnimal上调用该方法,那就没问题了:

System.out.println(oAnimal.get());

(你不能返回 System.out.println的结果,因为它是一个void方法。你也不能指定你的 void方法的返回值。)

请注意,这与泛型无关。只需使用String

即可演示您问题中的代码
Object o = "foo";
String text = (String) o;
System.out.println(o.length()); // Error; Object doesn't have a length() method
System.out.println(text.length()); // Prints 3

您的(已编辑)问题确实展示了泛型的使用,但您对Animal的强制转换是对原始类型的强制转换,因此将泛型从等式中删除更为简单 - 编译失败的原因与Animal是通用的无关。