【问题标题】:How to know the Dynamic type of a class?如何知道一个类的动态类型?
【发布时间】:2017-12-20 04:06:10
【问题描述】:

我的问题是,如何或者如果可能的话,知道编译器中对象的动态类型。 我有这个数据

public abstract class accommodation;
public class Hotel extends accomodation;
public class Cabin extends accomodation;
accomodation [] array=  new accomodation[x];

我的实际问题是,我可以从这里得到一个只有酒店的数组吗?

【问题讨论】:

  • 您可以使用if (a instanceof Hotel)(在每个元素上)过滤数组。
  • 如果你真的认为你有这个需求,我想说你的设计可能有问题。大多数情况下,最好将代码编写为接口,并处理一般的住宿对象而不是特定的子类。

标签: java


【解决方案1】:

一种方法是使用filtermap先过滤掉所有Hotels的对象,然后转换为Hotel

Arrays.stream(array)
    .filter(x -> x instanceof Hotel)
    .map(x -> (Hotel)x)
    .collect(Collectors.toList());

【讨论】:

    【解决方案2】:

    是的,有几种方法可以做到这一点。一种是使用getClass() 方法。因为这是在 Object 类中定义的,所以可以在每个 Java 对象上调用它。

    System.out.println(myObject.getClass());
    

    甚至

    if (myObject.getClass() == MyClass.class)
    

    但是如果你只想知道一个对象是否是某个特定类的实例,你可以这样写

    if (myObject instanceof MyType)
    

    如果myObject 的类是MyType 或其任何子类型,它将返回true。您可以在此处为MyType 使用接口或类 - 甚至是抽象类。

    但是,正如 Tim 在 cmets 中指出的那样,通常有更好的方法来设计您的程序,而不是依赖其中一种检查对象类的方法。谨慎使用多态性可以减少对其中任何一个的需求。

    【讨论】:

    • 只是指出,我编辑了我的问题。忘了提到住宿是一个抽象类。但是,“myObject”将指向动态类型,对吗?用于创建对象的类型,而不是用于声明变量的类型。所以..这应该有效吗? if (array[index] instanceof Hotel) -> 添加到新数组
    • 是的,if (array[index] instanceof Hotel) 应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2011-04-01
    • 2012-09-15
    • 1970-01-01
    • 2013-08-17
    相关资源
    最近更新 更多