我们正在尝试在应用和服务之间建立一个安全的 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/