0

我的方法将一个对象作为输入。我如何确定它的类型,然后相应地转换它?

例如:binarySearch( Object o );

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

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

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

因此,公平地说,我会接受涵盖原始问题的答案。

:)

4

3 回答 3

3

有两种方法可以做到这一点:

  1. 使用instanceof运算符。

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

于 2010-12-08T01:36:37.553 回答
3
if (o instanceof SalariedEmp)
    doSomethingWith((SalariedEmp)o);
于 2010-12-08T01:27:31.070 回答
3

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

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

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

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

但是,虽然这避免了(可能更昂贵的)RTTI,但它并没有避免演员。您可以添加一个方法 SalariedEmployee asSalariedEmployee(),该方法在基类中将返回 null,而在 SalariedEmployee 中将返回this。这给了你一个“安全”的演员表,但你仍然需要对 null 进行测试。

或者您可以只向 Employee 添加一个 Money getSalary() 方法。现在您不必进行任何选角,但您需要确定非受薪员工的薪水是多少;可以是 null、零或 NaN(特殊的 Not a Number 值)。

如果您决定返回 null,在某些情况下(例如,添加值)您必须针对 null 进行测试,而在其他情况下(例如,将薪水传递给 .equals())您不需要针对 null 进行测试,因为任何 instance.equals(null) 都应该按照 Object.equals() 的规范返回 false。

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

如果两个小时工的工资不存在相同,则返回一个 NaN 值。这只是“空对象模式”的一个特例。

于 2010-12-08T01:45:56.783 回答