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

时间:2015-06-24 00:37:23

标签: java object casting

我们正在尝试在应用和服务之间建立安全的IPC渠道。为此,我们提供了一个encrypt()和一个decrypt()函数,用于通信通道的两端。 encrypt()函数接受一个任意Java对象,使用json-io将其转换为一个字节数组,该数组被加密并通过base 64编码转换为Stringdecrypt()函数应该反其道而行 - 取b64 String,将其转换为已解密的字节,然后通过json-io运行以恢复原始对象。

除了decrypt()函数返回Object之外,这可能会按预期工作,因为我们不知道将哪种类型的对象传递到encrypt()函数。我们的期望是我们能够将生成的Object转换为正确的类型并将其返回给客户端代码。但是,程序失败并带有

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

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

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

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

我应该问一个不同的问题吗?

2 个答案:

答案 0 :(得分:1)

您可以将声明的事物作为对象投射到它实际上的任何类或接口,例如

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 的Object,但它不是String类的对象。

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

这里返回的东西一个对象(is-a)虽然它已经被无法访问的位扩展(除了通过反射)因为它们不是&# 39; t java.lang.Object的合同的一部分。

围绕这类事情的一种方法是Java Generics。如果你有public Object decrypt(...),你可以创建public T decrypt(...) - 但是你必须实际构建类或接口T的对象,而泛型完全是另一个主题,太大而无法进入这里。

因此,它取决于decryptObject(...)方法构建和返回实际的内容,以了解如何投射返回的对象。
要进行静态转换为(SomeClass) o,你必须已经知道它是什么。

答案 1 :(得分:0)

我发布了这个答案,用我的发现结束循环。

事实证明,问题不在于decrypt()函数返回的Object无法转换为正确的类型:真正的问题是提供普通{{1}的测试代码进入Object函数 - encrypt()是无法投放到Object的函数。一旦我设置了ListCertificatesOutputClass的外部定义,可以在导线的两端使用并将其传递到ListCertificatesOutputClass,那么encrypt()的输出会按预期工作。