【发布时间】:2014-01-20 17:26:35
【问题描述】:
我对此进行了广泛的研究,但似乎无法找到适合这种情况的最佳做法。
ArrayList<GenericObject<?>> list = new ArrayList<>();
list.add( new GenericObject<Integer>(6) ); // Autoboxing
list.add( new GenericObject<String>("HI") );
if(list.get( 0 ).getGenaricValue().getClass() == Integer.class){
GenericObject<Integer> gi = (GenericObject<Integer>) list.get( 0 );
System.out.println("Was Integer");
System.out.println(gi);
}
}
当这段代码工作时,从 GenericObject > 到 GenericObject
【问题讨论】:
-
非常人为的例子?如果无论如何添加通配符实例,通用包装器的意义何在?顺便说一句,对象包含
Integer的事实并不意味着它必须是GenericObject<Integer>,它也可能是GenericObject<Number>(因此允许某些方法将“盒装”Integer替换为Double.) -
解决这个问题的最佳方法可能是让
GenericObject<T>将另一个Class<T>作为参数并存储它,并有一个静态辅助转换方法(抑制未经检查的警告),它采用@ 987654330@ 和Class<T>并在验证存储的Class<T>值后将其转换为GenericObject<T>。 -
谢谢@mihi。我看到你关于类被定义为类型号并让一些人传入一个整数的观点。这是一个很好的观点,我没有想到这一点。至于这个例子的意义。假设我有一个所有类型的数据表。我想把它放在表格中,所以我创建了一个名为 Column
; 的对象。 Column 也有一个 T 类型的 ArrayList。如果我将所有这些列放在一个 ArrayList 中,我将拥有 ArrayList >;现在我需要添加一个新行。我必须将所有列转换为它们的原始类型才能将值添加到它们的内部数组 -
对于具有恒定列类型(和恒定列数)的表,我会尝试将它们建模为行列表(每个行都是具有正确类型字段的自定义类型行),而不是列列表。这样一来,您的列就有了名称和类型,并且添加新行很容易 :)
-
确实是这样。我正在构建的更多的是一个框架,用于从数据库创建表格表示形式,也许还有 Excel 电子表格,其中表格行是不可预测的。
标签: java generics casting wildcard