Java基于泛型类型执行不同的操作

时间:2014-03-22 21:01:28

标签: java generics

截至目前,我有一个类似于下面的对象。

public class DataField implements JSONable
{
    public final String name;
    public final Class<?> typeClass;
    private Object data;

    public <T> DataField(String name, Class<T> typeClass)
    {
        this.name = name;
        this.typeClass = typeClass;

        data = null;
    }
    public <T> T getData(Class<T> passClass)
    {
        if(!typeClass.equals(passClass))
            throw new TypeMismatchException("Type mismatch");
        return passClass.cast(data);
    }
    public <T> T setData(T obj, Class<T> passClass)
    {
        if(!typeClass.equals(passClass))
            throw new TypeMismatchException("Type mismatch");
        data = (Object) obj;
    }
    public String toJSON()
    {
        //The part that bugs me
        StringBuilder sb = new StringBuilder();
        switch(type)
        {
        case "myPackage.DataField":
            if(isArray)
                return TakesADataObjOrCollectionOfDataObjs(sb,Arrays.asList(get(DataObj[].class)));
            else
                return TakesADataObjOrCollectionOfDataObjs(sb,get(DataObj.class));
        break;
        default:
            if(isArray)
                TakesAnObjectOrCollection(sb,Arrays.asList(get(Object[].class)));
            else
               TakesAnObjectOrCollection(sb,get(Object.class));
        break;
        }
        return sb.toString();
    }
}
//I did not include code for DataObj but it has a HashMap<String,DataField>
//fields on it and two functions for getting and setting field data 
//without actually divulging the field objects themselves.

背景:问题在于最后一个toJSON功能。我有两个不同的函数(在此列为TakesADataObjOrCollectionOfDataObjsTakesAnObjectOrCollection),根据对象是否实现JSONable来执行不同的操作。现在我无法将这些全部简化为一个函数并让编译器选择因为类型擦除,我不能拥有同时使用Collection<?>Collection<? extends JSONable>的函数,因为它们具有相同的函数签名。
当我只需要区分ObjectDataObj类型时,这很简单(这是一个非常简单的检查,我所要做的就是传递我们所用类型的Class<?>使用)但现在我需要开始存储List<?>List<? extends JSONable>

当前解决方案:我确实为此解决方案提供了一些代码,但它与上图所示的不同。目前的解决方案只是包括我正在使用的通用类型,以及typeClassgenericTypeClass。这个问题是它开始变得非常混乱,因为:

  • 仅采用typeClass的所有适当方法现在需要两种方法,一种同时采用{​​{1}}和typeClass,另一种采用genericTypeClass但设置typeClass }到null。
  • 如果我甚至可以在某些情况下完成,我在执行类型检查(获取和设置)方面会遇到更多麻烦。
  • genericTypeClass切换语句将填充更多案例,每个支持的通用一个,然后在每个案例下,检查toJSON以查看它是否为genericTypeClass


问题:有没有其他方法可以创建此类来执行我想要的操作(存储不同的数据但仍然能够根据DataObj持有的类型输出不同的JSON)?

希望只是解释情况而不是问3或4个其他相关问题会阻止我只是问这个问题而成为XY Problem的牺牲品。

1 个答案:

答案 0 :(得分:2)

我建议您使用 Jackson 将对象转换为 JSON字符串

很容易上班(认真),它可以为您节省大量时间和潜在的错误......它还支持您可以使用的一些功能,我正在考虑{的序列化{1}}例如:)

以下是interesting blog to get you going with Jackson Json的链接 这是指向the download page for Jackson Json的链接。


以下是我刚刚向您展示如何使用它的一个小例子:

List

Ouptut:

public class Main {
    public final String mainStr = "Hello";

    public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
        final ObjectMapper om = new ObjectMapper();
        System.out.println("Serialized Main: " + om.writeValueAsString(new Main()));
        System.out.println("Serialized A: " + om.writeValueAsString(new A()));
        System.out.println("Serialized AA: " + om.writeValueAsString(new AA()));
        System.out.println("Serialized B: " + om.writeValueAsString(new B()));
        System.out.println("Serialized List of A: " + om.writeValueAsString(Collections.singletonList(new A())));
    }

    static class A extends Main {
        public final String aStr = "World";
        public final int aInt = 42;
    }

    static class AA extends A {
        public final String aaStr = "Foo";
    }

    static class B {
        public final String bStr = "Bar";
        public final boolean bBool = true;
    }
}

如果您遇到麻烦,我们可以在the chat进行讨论,我可以在那里给您更多帮助。

干杯!