【问题标题】:Generic and dynamically associated type通用和动态关联类型
【发布时间】:2015-04-02 22:19:58
【问题描述】:

可能,我会问一个可怕的问题,因为 JAVA 是强类型语言,但我会问它,这是肯定的。

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

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

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

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

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

(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>());

【问题讨论】:

  • 不,泛型是编译时构造。类型必须在编译时知道。
  • 所以和我想的一样。谢谢@SotiriosDelimanolis
  • 也许如果我们知道您为什么要这样做,我们可以建议一个可行的替代方案。
  • 你知道列表中每个特定元素的实际类型是什么吗?

标签: java generics


【解决方案1】:

一旦您将 Boolean 和 ArrayList 放在某个 Collection 中,Collection 的泛型类型就必须是两者的共同类型,只剩下 Object - 因此您没有关于集合中类型的信息完全没有。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 也许你应该解释一下这实际上是做什么的,它的局限性是什么,为什么它可能有用也可能没用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多