【问题标题】:How to get the type of a value (Java)如何获取值的类型(Java)
【发布时间】:2015-12-25 23:25:42
【问题描述】:

我在网上看到的解决方案是有道理的;如果你知道变量的类型,那么你就知道它的值的类型。 Java 做到了这一点。但是,如果我有一个这样的继承类系统......

DynastyPQ (base class)
FirstPQ (inherited class)

并以这种方式创建对象...

DynastyPQ pq = new FirstPQ();

有没有办法获取 FirstPQ 的 type 以便我可以在强制转换中使用它,以便我可以访问该类的专有方法?也许类似于这个?

(typeof(pq's value)pq).exclusiveMethod()

【问题讨论】:

  • 不,不是不使用反射(绕过类型安全)。这与您的代码不完全一致,但您可以这样做 if (pq instanceof FirstPQ) ((FirstPQ)pq).exclusiveMethod();
  • @Bohemian 可以使用访客。这可能超出了他的要求,但从技术上讲,您可以在不进行反射的情况下检查类型
  • 试试 'getClass()' 方法

标签: java casting


【解决方案1】:

你有几个选择。

  1. 你可以使用反射
  2. 你可以使用instanceof
  3. 您可以使用访问者模式

对于这些示例,我们将尝试查找此变量的类型:

Object obj = new TargetType();

我们想查看obj 引用的对象是否属于TargetType 类型。


反思

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

if(obj == TargetType.class) {
    //do something
}

上面代码背后的想法是getClass() 返回一个对用于实例化该对象的Class 对象的引用。您可以比较参考。

if(TargetType.class.isInstance(obj)) {
    //do something
}

Class#isInstance 检查传递给方法的对象值是否是我们正在调用isInstance 的类的实例。如果obj为空,它将返回false,因此不需要进行空检查。这需要强制转换才能对对象执行操作。


实例

这个很简单:

if(obj instanceof TargetType) {
    //do something
}

instanceof 是语言规范的一部分。如果obj 为空,则返回false。这需要强制转换才能对对象执行操作。


访客模式

我已经在我的other answers 之一中详细解释了这一点。您将负责处理null。您应该更深入地研究该模式,看看它是否适合您的情况,因为这可能是矫枉过正。这不需要强制转换。

【讨论】:

    【解决方案2】:

    试试getClass() 方法。 这将返回特定对象的运行时类。 http://www.tutorialspoint.com/java/lang/object_getclass.htm

    【讨论】:

    • 问题是,如何在运行时强制转换到这个运行时类
    • @Smac89 getClass().cast()?注意:我不知道......这对我来说都是未知的领域,但是我通过这个问题的概念和答案学习了很多有趣的信息。 =)
    【解决方案3】:

    有几个选项:

    1. 使用instanceof 运算符:

      • if (pq instanceof FirstPQ) {((FirstPQ)pq).exclusiveMethod();}
    2. 使用Class.isInstance(Object obj) instance 方法:

      • FirstPQ firstPQ; if(pq.getClass().isInstance(firstPQ)) { firstPQ = (FirstPQ)pq; }
        (注意:尚未测试。 已确认。
    3. 使用访客模式:

    【讨论】:

    • 不是 100% 正确,看看我的回答
    • @VinceEmigh 什么不是(100% 正确)?
    • "如果不通过反射绕过类型安全,这实际上无法在 Java 中以动态、非声明性的方式完成。" - 这就是我所指的语句.你的回答是正确的,只是我发现这句话有点不对劲
    猜你喜欢
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    相关资源
    最近更新 更多