为什么要使用instanceof运算符?

时间:2013-02-24 03:23:34

标签: java instanceof

我正在尝试回答这个简短的回答问题,但我很难理解我的导师所说的“为什么我们想知道这个?”。非常感谢任何建议。

问题:

“对于instanceof运算符有什么用?显然它会指定它是”某个东西的实例 - 这不是答案。问题是,为什么我们想要知道?“

5 个答案:

答案 0 :(得分:3)

instanceof运算符的最明显和最常见(错误)使用是决定子类的特殊处理:

void recordPayment(Payment pmt) {
    // Do something common for all subclasses
    recordAmount(pmt.getAmount());
    // Do something special for the credit card subclasses
    if (pmt instanceof CreditCardPayment) {
        CreditCardPayment ccPmt = (CreditCardPayment)pmt;
        recordCreditCardNumber(ccPmt.getCardNumber());
    }
}

instanceof的使用经常表明您的设计缺少基类中的函数和派生类中的覆盖。

答案 1 :(得分:1)

如果想要downcast类型,他可能需要instanceof运算符。但那是usually indicates code smells

您可以参考这篇文章:"Prefer polymorphism over instanceof and downcasting"

<强>更新

似乎OP没有得到预测点,让我们更详细地解释一下。

向下转换将对象/值的表观类型细化/缩小到其子类型之一,使其具有子类型的语义

当对象/值声明为超类型时,这很有用,但调用者需要某些子类型中具有特定的语义或接口(即那些 >在超类型中缺席)。只有在对象/值传递instanceof的测试并被下载到该子类型之后,调用者才能使用其特定的语义或接口。

答案 2 :(得分:1)

需要使用它的一个非常常见的地方是使用JSON。您可以接收JSON值,该值是类似地图和类似数组的项目的“嵌套”,并且类似数组的项目的特定元素的类型可以是类似地图或类似数组的,具体取决于关于众多因素。

所以instanceof用于对此进行排序,或者至少确保存在预期的类型,而不是尝试演员和炸毁。

答案 3 :(得分:0)

取决于您的需求。我几乎一直使用“实例”,比如当我处理带有“Object”类型的变量等时。

一个简单的事情是在数组中使用不同类型的对象。例如:

Object[] data = new Object[4];

data[0] = "String";
data[1] = 32;
data[2] = 32.64D;
data[3] = new ArrayList<String>();

然后,您可以查看内容:

if (data[0] instanceof String) {
  // Content at index '0' is a String
}

答案 4 :(得分:0)

在这种情况下,您有一个superclass引用,可以引用任何派生类实例。
例如,有一个abstractClothes。从中派生出三个班级ShirtShortsJeans

Clothes coolshirt=new Shirt();
Clothes coolshorts=new Shorts();
Clothes cooljeans=new Jeans();
Clothes gift=receiveGift();
if(gift instanceof Shirt)//Is the gift refers to a instance of Shirt
sendGratitude("Thanks for your new Shirt. It is really cool");
else if(gift instanceof Shorts)//Is the gift refers to a instance of Shorts
sendGratitude("Your shorts fits nice for me.Thank you.");
else if(gift instanceof Jeans)//Is the gift refers to a instance of Jeans
sendGratitude("In your Jeans I really look, Handsome, Very Thanks");