java - 如何将 java 对象转换为任意其他类型

标签 java object casting

我们正在尝试在应用和服务之间建立一个安全的 IPC channel 。为此,我们提供了用于通信 channel 两端的 encrypt()decrypt() 函数。 encrypt() 函数采用任意 Java 对象,使用 json-io 将其转换为字节数组,该数组被加密并转换为 String 通过base 64编码。 decrypt() 函数应该做相反的事情 - 获取 b64 String,将其转换为解密的字节,然后通过 json-io< 返回 恢复原始对象。

这可能按预期工作,除了 decrypt() 函数返回一个 Object,因为我们不知道什么类型的对象被传递到 加密()功能。我们的期望是我们能够将生成的 Object 转换为正确的类型并将其返回给客户端代码。但是,该程序失败了

java.lang.ClassCastException: java.lang.Object cannot be cast to ... 错误。

有没有办法在 Java 中解决这个问题?我发现的所有阅读 Material 似乎都表明不是,但我不知道这是否仅仅是因为我不知道要问的正确问题,或者 Java 是否不会这样做。 (我和我的合作者都来自 C++ 背景,在这种情况下这类事情是微不足道的。)

我想到的一个可能的解决方案是为 decrypt() 函数设置不同的返回类型,可以转换为任意类型,但如果有这样的野兽,我会感到惊讶。

另一个想法是为每种类型的返回对象实现一个单独的 decrypt() 函数,但这似乎是一种困惑的方法,并且随着添加更多类型,这种方法会变得越来越笨拙。

我应该问其他问题吗?

最佳答案

例如,您可以将一个声明的对象转换为它实际上是的任何类或接口(interface)

Object o = java.util.Calendar.getInstance().getTime().toString();
// o is declared as an object but is really a String

// this is fine
String s1 = (String) o;
// this is also fine because String implements CharSequence
CharSequence cs = (CharSequence) o;

同样,一个方法可以声明为返回 Object,同时返回 Object 的某些特定子类,然后可以将返回值强制转换为要返回的特定对象。

但是,如果一个东西被构建为一个对象,它就不能被转换为任何东西;它可能是一个类似于 String 的对象,但它不是 String 类的对象。

public Object getThing(final Object arg) {
    return new Object() {
        private String str = arg.toString();
        public String getStr() {
            return this.str;
        }
    };
}

这里返回的东西一个对象(is-a),尽管它被扩展了一些无法访问的位(除了通过反射),因为它们不是 java.lang 的一部分.对象的契约。

解决这种问题的一种方法是 Java 泛型。如果您有 public Object decrypt(...),您也许可以创建 public T decrypt(...) — 但您必须实际构建类的对象或接口(interface) T,而泛型完全是另一个主题,太大了,无法在此处展开​​。

因此,这取决于实际上正在构建和由您的 decryptObject(...) 方法返回的内容,以决定如何转换返回的对象。< br/> 要将静态转换为 (SomeClass) o,您必须已经知道它是什么。

关于java - 如何将 java 对象转换为任意其他类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31015740/

相关文章:

java - Java中UTC日期解析不一致

java - 通过其他类构造函数在主方法中创建对象时访问对象属性

javascript - 函数何时以 }; 终止

javascript - 过滤数组中 45,000 个条目的最快和最有效的方法是什么?

c++ - 如何在 C++ 中将 unsigned int(指针)转换为 const char

java - 在运行时通过反射进行强制转换

java - 在不对返回类型进行类型转换的情况下调用工厂

java.lang.NullPointerException : (ListFragment)

java - 需要默认公共(public)构造函数的服务加载器实现

java - 有没有比 if 序列更好的方法来处理事件?