【问题标题】:is it possible to have a mixed variable in Java like in PHP?是否可以像 PHP 一样在 Java 中使用混合变量?
【发布时间】:2017-07-13 18:45:00
【问题描述】:

以 PHP 为例:

<?php

    $my_var = 1;
    $my_var = [ "1" ]; // no problem

在 Java 中,我尝试使用混合参数创建一个类:

class MyClass {
  public String my_var; 
}

MyClass c = new MyClass();
c.my_var = "ok";
c.my_var = 1; // error during compilation time

我问这个的原因是因为我正在使用带有 json 的球衣,并且我尝试创建一个反馈类。

我的反馈类中的一个参数是以 Ajax 方式发送回前端的数据。有时data 是一个普通的字符串:

`{ "data" : "hello world" }`

有时它可以是一个数组

`{ "data" : [ "hello", "world" ] }` or `{ "data" : [ { "id": 1 }, { "id": 2 }, ... ] }`

当谈到 Java 语言和库时,我是一个真正的菜鸟。我现在能想到的唯一解决方案是覆盖 Json 编码中涉及的对象的 toString 方法,但是“toString”使用 List 会给我类似的东西,

 `{ "data" : "[ ...]" }` which is incorrect.

【问题讨论】:

  • 将其设为Object 类型是唯一的方法,但请注意这是真的 非Java 风格。更好的做法是为您需要的方法提供一个接口,并为所有可能性实现类。
  • @LouisWasserman 我会小心的,谢谢这个现在有效。
  • 郑重声明:我在答案中添加了更多内容;涵盖您问题中的真正问题。

标签: java php json


【解决方案1】:

你可以这样做:

Object c = new Object();
c = new String("hi"); //valid
c = new Integer(1); //valid

然后检查它是什么类型的变量,你可以使用instanceof

您也可以将其设为数组或列表,如果您想在其上使用toString 来打印出任何对象,您可以使用重写的toString 方法创建您自己的列表类,该方法可以很好地打印它,并在您的对象中使用该类

使用具有良好toString 方法的对象意味着如果您只想获取对象的字符串表示形式,则不必使用instanceof

【讨论】:

  • 这里不需要明确使用 new:c = "hi"; c = 1;.
  • @AndyTurner 是的,但我想说明后端实际发生的情况
【解决方案2】:

Java 是一种静态类型的语言;而“动态”仅限于诸如将子类值分配给超类变量之类的事情,例如:

Object o = "a string";
o = new Double(42.0);

所以看起来o 既可以是字符串也可以是整数。但如前所述;那是因为 Object 是 both 那些类的超类型。

例如:

String s = "meow";
s = 42;

导致编译器错误。例如,再次起作用的将是s = Integer.toString(42)

同样,你可以这样做:

Object o = new int[5];

因为在 Java 中 any 引用类型(包括数组)是 Object 的子类。

准确地说:Java 人认为这是一个优势。因为它允许在编译时进行更多检查 - 捕获许多错误,这些错误需要您使用动态语言编写/运行单元测试,在这些语言中鸭子可以像猫一样喵喵叫,最后仍然会吠叫。

回到您的问题:从Java 的角度来看,数组与字符串不同。因此,您不会降低这样的 JSON 表示形式。换句话说:我会首先尝试更改 JSON 格式。

如果这是不可能,我会研究自定义 JSON 反序列化代码 - 以便让框架决定给出哪种情况并做适当的事情.作为灵感,您可以看看如何使用gson 完成此操作。

【讨论】:

    【解决方案3】:

    目前你还不能在 Java 中做到这一点,所以你必须做一个间接的解决方法,但是有计划在 Java 版本 10 中实现无类型对象/变量(目前为 8,几乎移至 9)

    【讨论】:

      【解决方案4】:

      想想哎呀,

      有一个类似FeedBackResponse的接口,对每种情况都有不同的实现类,让它们实现FeedBackResponse。 每个类都有不同的属性。

      使用 json 库序列化对象。

      前,

      FeedBackResponse response = getResponse("Some Service");
      return jsonLib.serialize(response);
      

      工厂

      private FeedBackResponse getResponse(String attr){
      // based on attr create ur object here.
      }
      

      【讨论】:

        猜你喜欢
        • 2014-08-28
        • 2020-06-28
        • 2012-01-30
        • 2022-06-13
        • 2010-11-23
        • 2013-06-23
        • 1970-01-01
        • 2018-07-17
        • 2014-09-20
        相关资源
        最近更新 更多