繁体   English   中英

为什么要使用instanceof运算符?

[英]WHY would one want to use the instanceof operator?

我正在尝试回答这个简短的问题,但我很难理解我的讲师“为什么我们想知道这个”的意思。 任何意见是极大的赞赏。

问题:

“ instanceof运算符的用途是什么?显然,它将指定它是否是某事物的“实例”,而不是答案。问题是,为什么我们想知道这一点?”

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几乎可以肯定地表明您的设计缺少基类中的函数,而缺少派生类中的重写。

如果要转换类型,则可能需要instanceof运算符。 但这通常表示代码有异味

您可以参考这篇文章: “比实例化和向下转换更喜欢多态”

更新

看来OP并没有解决问题,让我们更详细地说明一下。

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

当将对象/值声明为其超类型时 ,这很有用,但是调用者需要一些特定于子类型(即,超类型中不存在的语义或接口)的语义或接口。 只有在对象/值通过instanceof的测试并向下转换为该子类型之后,调用方才可以使用其特定的语义或接口。

JSON是最需要使用的地方。 您会收到一个JSON值,它是类似地图的和类似数组的项的“巢”,例如,类似数组的项的特定元素的类型可以是类似地图的或类似数组的,具体取决于在许多因素上。

因此,使用instanceof来解决这个问题,或者至少确保存在期望的类型,而不是尝试强制转换和崩溃。

取决于您的需求。 我几乎所有时间都使用“实例”,例如当我处理“对象”类型的变量时,等等。

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

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
}

在这种情况下,您有一个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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM