2015-04-02 61 views
0

可能,我会问的是一个可怕的问题,因为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,但可能与仿制药的一些帮助这可能是不可思议的? 我会在SomeObjects的列表中添加该项目将以这样的方式添加:

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

不,泛型是编译时构造。编译时必须知道类型。 – 2015-04-02 22:21:27

+0

所以就像我想的那样。谢谢@SotiriosDelimanolis – 2015-04-02 22:23:47

+1

也许如果我们知道你为什么想这样做,我们可以建议一个可行的选择。 – Radiodef 2015-04-02 22:30:02

回答

2

你将一个布尔值和一个ArrayList一起放入某个集合中,该集合的泛型类型必须是两种常见的类型,它们只是留下了Object - 因此根本没有关于集合中类型的信息。

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

-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; 
} 
+0

也许你应该解释一下这个实际做了什么,它的局限性以及它为什么可能有用或没用。 – Radiodef 2015-04-02 23:55:24