检测对象类型然后相应地投射它?

时间:2010-12-08 01:26:36

标签: java types casting object downcast

我的方法将Object作为输入。我如何确定它的类型,然后相应地投射它?

例如:binarySearch( Object o );

在binarySearch方法中,我需要一种方法来确定Object o的类型(或类)。然后我需要使用那种类型。我该怎么办?

更具体地说,Object o是基类的子类(EG SalariedEmp是Employee的子类),我特别需要基类。

编辑: 我想出了如何做我想做的事情,这应该是一个完全不同的问题。我需要使用Comparable中的.compareTo方法来设置一种基于来自这些对象的私有数据来比较两个对象的方法。我所要做的就是使用implements关键字将我的课程称为“可比较”。因此,无论在我的binarySearch方法中比较什么类型的对象,如果它们具有相同(未知)类型并且实现了Comparable,则它可以工作。这使得我的binarySearch方法可以与任何类型的类似类重复使用。

所以,平心而论,我会接受涵盖原始问题的答案。

:)

3 个答案:

答案 0 :(得分:3)

if (o instanceof SalariedEmp)
    doSomethingWith((SalariedEmp)o);

答案 1 :(得分:3)

两种方法:

  1. 使用instanceof运算符。

  2. 在对象上调用getClass()(确保先检查为null)。

答案 2 :(得分:3)

您可以使用instanceof运算符或在实例上调用.getClass()来使用RTTI(运行时类型标识),但这几乎总是表明您使用的超类型是错误的超级类型,或设计不当。

在您的情况下,您不需要使用Object,因为您已经知道您至少拥有一名员工。

面向对象的范例是你不要求对象实例它是什么,你要求它做某事。在这种情况下,您可以选择几个可能要求Employee对象执行的操作。哪一个是您的最佳选择取决于您正在尝试建模的内容:

您可以通过向Employee基类添加虚拟方法boolean isSalaried()来询问它是否有薪,然后可能会将其强制转换。基本方法将返回false,但SalariedEmployee将覆盖该方法并返回true。

虽然这可以避免(可能更昂贵的)RTTI,但它并没有避免演员。您可以添加一个方法SalariedEmployee asSalariedEmployee(),它在基类中将返回null并且在SalariedEmployee中将返回this。这为你提供了一个“安全”的演员阵容,但是你还需要一个针对null的测试。

或者您可以向Employee添加Money getSalary()方法。现在你不需要做任何演员,但是你需要决定一个没有薪水的员工的工资是多少;可以是null,零或NaN(特殊的非数字值)。

如果您决定返回null,在某些情况下(例如,添加值)您必须测试null,在其他情况下(例如,将工资传递给.equals())您不需要测试null,因为任何instance.equals(null)都应该通过Object.equals()的规范返回false。

如果你返回零,你可以在没有测试的情况下添加null,但是equals可能有点奇怪 - 两个每小时工人(每个人都没有工资)的薪水是否相同(不存在)真的是真的吗?这取决于你的建模。如果是,则返回零。

如果两名小时工不具有相同的不存在薪水,则返回NaN值。这只是“空对象模式”的特定情况。