繁体   English   中英

通用且动态关联的类型

[英]Generic and dynamically associated type

由于JAVA是强类型语言,因此我可能要问的是一个可怕的问题,但是可以肯定的是,我会问。

我想实现一些模型,杰克逊将映射到该模型。 假设我们有一个:SomeObject,它具有一个属性值。 SomeObject是一个接口:

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

值可以是布尔值,可以是列表或可以是简单字符串。 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>());

一旦将布尔值和ArrayList放到某个Collection中,Collection的泛型类型将必须是两者的某种通用类型,而这只是离开Object,因此您根本没有任何关于该类型的信息。

要直接回答您的问题:不,没有办法在泛型中保存某种类型,因为泛型在运行时就消失了。

也许一个辅助方法会帮助您假装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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM