将实例强制转换为某种类型的重点是什么?

时间:2012-04-13 03:25:05

标签: java types

我对将实例声明为特定类型的目的感到困惑。例如,

Integer intOb1 = new Integer(3);
Object intOb2 = new Integer(4);

我知道intOb1的类型为IntegerintOb2的类型为Object,但将intOb2声明为Object的内容是什么允许一个人做?使用Object中的方法?你不能将这些方法用作Integer吗?或者,主要目的是将“{1}}”视为对象?

如你所见,我迷糊了。

3 个答案:

答案 0 :(得分:2)

当涉及Object时,你永远不会得到任何有用的东西,因为它是一种在任何地方都无济于事的通用类型。

但想想不同的情况:

List<String> list = new ArrayList<String>();

这意味着具体的内容:listArrayList,并声明只是通用的List集合强制执行以下事实:在整个代码中,您不会使用任何ArrayList具体方法。

这有效地允许您声明您不会依赖任何特定实现,稍后您将被允许将ArrayList<String>()切换为LinkedList<String>(),而不必修改任何其他内容。< / p>

答案 1 :(得分:2)

这个实际不叫做cast这是多态的一个例子。这允许变量根据与其他类的继承关系采用不同的类型。

例如,假设您正在编写一个程序来模拟动物园。您将拥有一个名为Zoo的类和一个名为Animal的类。还有几个类从Animal类扩展而来:LionZebraElephant

将所有这些对象组合在一起放在一个列表中非常有用,但由于它们的类型不同,即:LionZebraElephant,无法将它们存储在单个列表中,您必须为每种类型的动物维护一个单独的列表。这就是多态性发挥作用的地方。

由于每个类LionZebraElephant都来自Animal类,我们只需将它们存储在Animal类型的列表中}。

代码示例:

public class Zoo
{
   private List<Animal> animals; 

   public Zoo()
   {
      this.animals = new ArrayList<>();
   }

   //notice this method takes an Animal object as a parameter
   public void add(Animal a)
   {
      this.animals.add(a);
   }
}

public abstract class Animal
{
   private String name;
   private String type;

   public Animal(String name, String type)
   {
      this.name = name;
      this.type = type;
   }

   //all subclasses must implement this method
   public abstract void speak();
}

public class Lion extends Animal
{
   private String animalType = "Lion";

   public Lion(String name)
   {
      super(name, animalType);
   }

   public void speak()
   {
      System.out.println("ROAR");
   }
}

//....etc for the other two animals

public class TestZoo
{
   public static void main(String[] args)
   {
      Zoo myZoo  = new Zoo();
      Lion l     = new Lion("Larry");
      Elephant e = new Elephant("Eli");
      Zebra    z = new Zebra("Zayne");

      myZoo.add(l);  //<-- note that here I don't pass Animal objects to the 
      myZoo.add(e);  //    add method but subclasses of Animal
      myZoo.add(z);
   }
}

希望这有帮助,即使有一个愚蠢的例子。

答案 2 :(得分:0)

您始终可以从任何类型的对象使用“Object”类的方法,因为所有类都是“Object”的子类

相反,你需要理解为什么有人创建类型为Object的对象:

当您想要编写某些方法/功能并且您不确定哪种类型的对象可能作为输入时,通常需要类型转换。 JDK中最常见的一个例子是比较器中的equals方法或比较方法。

// Object equals method - written for such generic use.
boolean     equals(Object obj) {
  //Here you might want to check which is other type of object.
  if (!obj instanceof CurrentClass) {
      return false;
  }
  //Additional logic required to check equality of object.
}

类似的情况也出现在早期的Collection库(JDK 1.4)中,但JDK 1.5引入了一个名为generic的新功能。