在Java的同一个泛型arraylist中存储不同的参数化类型

在Java的同一个泛型arraylist中存储不同的参数化类型,java,generics,parameterized-types,Java,Generics,Parameterized Types,我喜欢用java创建数据库表的类表示。 列被设计为泛型类,以便它可以处理表列可能具有的所有不同数据类型 public class TableColumn<T> { ... } 然后我可以用以下方式操作数据: String a = t.Cols(2).Row(3); t.Col(2).Row(3) = "b"; 但我正在失去类型安全与我目前的方式来实现这一点。。。我的问题是如何实现列,因为潜在的列可以获得不同的数据类型 有人有线索吗?如果类型组合数量有限,您可以使用接口来实

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

public class TableColumn<T> {
    ...
}
然后我可以用以下方式操作数据:

String a = t.Cols(2).Row(3);
t.Col(2).Row(3) = "b";
但我正在失去类型安全与我目前的方式来实现这一点。。。我的问题是如何实现列,因为潜在的列可以获得不同的数据类型


有人有线索吗?

如果类型组合数量有限,您可以使用接口来实现这些组合。这将允许您以相同的方式存储列,并且不需要任何特殊的转换

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 name;
int points;
int number;
String location;
Date dateBuilt;
String name;
ArrayList<Players> roster;
带场地的班级体育场:

String name;
int points;
int number;
String location;
Date dateBuilt;
String name;
ArrayList<Players> roster;
具有字段的类团队:

String name;
int points;
int number;
String location;
Date dateBuilt;
String name;
ArrayList<Players> roster;
字符串名;
ArrayList名册;

然后,您可以只保存列表或arraylist中的所有值,并用数据库表分隔它们,而不必猜测您在哪个表中。你必须抓住更多的对象,但你将能够知道更多你正在处理的东西。

所以你希望
col(2)
的类型不同于
col(3)
?那是不可能的。这仅仅是因为类型检查发生在编译时,而参数值对它们没有影响。还有其他可行的方法吗?另一个概念另一个结构?你可以通过使用一个只强制转换到
T
T get()
方法来伪造这个概念。这将允许编译
字符串x=foo.get()
整数x=foo.get()
。但这也是缺点:您会丢失所有编译时类型检查。当您错误地使用它时,它只会在运行时崩溃并烧毁。这太糟糕了,我绝对希望保持类型安全。您能更详细地解释一下吗?等等,您是否正在寻找存储列的替代方法?或者在一列中使用多个类型时遇到问题?两者都有。首先,我希望在一列中使用多个类型,而不会丢失类型安全性。如果不可能的话,另一种方法会很好。问题是我不知道我的表会有多少列,也不知道它们是哪种类型的。。。