通用和动态关联的类型

时间:2015-04-02 22:19:59

标签: java generics

或许,我要问的是一个可怕的问题,因为JAVA是强类型语言,但我会问它,确定。

我想实现几个杰克森将映射到的模型。 假设我们有一个: SomeObject具有属性值。 SomeObject是一个接口:

interface SomeObject <T> {
    T getValue();
}

值可以是布尔值,可以是List,也可以是简单的字符串。 ObjectOne和ObjectTwo实现SomeObject 我想知道,如果我们有这样的对象:

List<SomeObject> someObject = new ArrayList<>();

我们将在该列表中有:ObjectOne,ObjectTwo如果有可能在每个对象上调用getValue,而不将其强制转换为给定的类,则获取正确的值? 我知道我可以这样做:

(String) list.get(0).getValue();

但是有办法获得这样的结果:

String firstItemIsAString = list.get(0).getValue();
ArrayList secondItemIsAnArrayList = list.get(1).getValue();

我知道这不是一个javascript,但也许有一些Generics的帮助,这可能是适合的? 我将在SomeObjects列表中添加该项将以这种方式添加:

List<SomeObject> list = new ArrayList<>();
list.add(new ObjectOne<String>());
list.add(new ObjectTwo<ArrayList>());

2 个答案:

答案 0 :(得分:2)

只要将Boolean和ArrayList放在一起集合中,Collection的泛型类型就必须是两者的常见类型,它们只留下Object - 因此您没有关于集合中类型的信息一点都不。

直接回答你的问题:不,没有办法在泛型中保存某些内容,因为它们在运行时已经消失了。

答案 1 :(得分:-1)

也许辅助方法可以帮助你假装Java不太安全:

public interface SomeObject <T> {
    T getValue();
}
public static void main(String...args){
    List<SomeObject<?>> objectList=new ArrayList<SomeObject<?>>();
    String firstItemIsAString = converter(objectList.get(0).getValue());
}
public static <t> t converter(Object input){
    return (t) input;
}