在Java中的相同通用arraylist中存储不同的参数化类型

时间:2013-06-05 15:20:45

标签: java generics parameterized-types

我喜欢在java中创建数据库表的类表示。 列被设计为泛型类,以便它可以处理表列可能具有的所有不同数据类型。

public class TableColumn<T> {
    ...
}

一个表有0 ... n TableColumns,所以我的表类看起来像这样:

public class Table {
    protected ArrayList<TableColumn<T>> columns =
                new ArrayList<TableColumn<T>>();
    ...
}

我们的想法是以下列方式添加列。

Table t = new Table();
t.addColumn(String.class);
t.addColumn(Integer.class);
t.addColumn(Date.class);
t.addColumn(String.class);

然后我可以通过以下方式操作数据:

String a = t.Cols(2).Row(3);
t.Col(2).Row(3) = "b";

但是我正在以我目前的实现方式失去类型安全性......我的问题是如何实现列,因为列可能获得不同的数据类型。

有人有线索吗?

2 个答案:

答案 0 :(得分:0)

如果类型组合数量有限,您可以使用接口作为这些组合。这将使您能够以相同的方式存储列,并且您不需要任何特殊的铸件。

t.addColumn(MyInterface.class);

另一种方法仍然不会像你想要的那样干净但是有点不可避免,就是使用一个新的类,它允许你承担一些铸造和类型检查的负担

示例:

public static class MyWrapper{
    Class<?>[] validPossibleClasses;
    Object o;
    public MyWrapper(Class<?> ...classes){
        this.validPossibleClasses = classes;
    }
    public boolean validateClass(Class<?> clazz){
        for (Class<?> c : validPossibleClasses){
            if (!c.isAssignableFrom(clazz))
                return false;
        }
        return true;
    }
    public void set(Object o) throws Exception{
        if (!validateClass(o.getClass()))
            throw new Exception("Bad Cast");
        this.o = o;
    }
    public String getString(){
        return (String) o;
    }
    public Integer getInt(){
        return (Integer) o;
    }
    ...
    // more specific getters
}

用法就像这样

String a = t.Cols(2).Row(3).getString();
t.Col(2).Row(3).set("b");

答案 1 :(得分:0)

为什么不为每个表创建一个不同的对象?类似的东西:

带有字段的职业玩家:

String name;
int points;
int number;

Class Stadium with fields:

String location;
Date dateBuilt;

Class team with fields:

String name;
ArrayList<Players> roster;

然后你可以只保存列表或arraylist中的所有值,并将它们与数据库表分开,而不必猜测你所在的表。你必须保留更多的对象,但你会能够更多地了解你正在处理的事情。