在运行时确定泛型的转换类型

时间:2011-12-22 17:06:37

标签: java generics runtime

我的问题与here完全相似。就是这样,我想用Java做。

假设,我想列出一个列表:

List<a_type> myList = new ArrayList<a_type>();

问题是a_type将是什么,是根据条件决定的。两种可能的类型是完全不相关的,没有超类但是Object是共同的。如果我可以将Type存储在变量requiredType中并将其用作List<requiredType>,我的问题就会得到解决。我不确定我是不是只是贪婪,愚蠢或无知,但这就是情况。

虽然不重要,但解释了我需要它的原因的场景解释here


PS:请不要提及类型擦除。请考虑这种情况。我可以很好地在问题中提到它。如果您认为存在设计问题,请仔细阅读情况here并提出替代方案。

4 个答案:

答案 0 :(得分:2)

这在Java中是不可能的,因为类型擦除并且由于泛型仅限于编译时间。

e.g。

List<Integer> integers = new ArrayList<Integer>();

在编译期间,当完成类型擦除时变为

List integers = new ArrayList();

泛型只是告诉编译器的一种方式,列表应该只处理Integer类型的对象,如果你有某个地方试图添加{{1}以外的其他东西,那就让它指出来吧为了类型安全。

答案 1 :(得分:2)

我能看到的唯一有效(如果“冒险”)方式,将类似于:

     List<?> myList = new ArrayList<?> ();

     /* … */

     final Object o = myList.get (0);

     if (o instanceof OneType) {
           OneType o1 = (OneType)o;
           /* … */
     } else if (o instanceof OtherType) {
           OtherType o2 = (OtherType)o;
           /* … */
     } else {
           throw new RuntimeException ("unexpected type found in list…");
     }

您可能希望使用@SuppressWarnings

来丢弃该代码

可能更好(?)的想法是在两种类型中至少实现“标记接口”(没有任何方法),并将其用作通用性。

     public interface CanBeAddedToDualTypedList { };
     public class OneType implements CanBeAddedToDualTypeList { … };
     public class OtherType implements CanBeAddedToDualTypeList { … };


     List<CanBeAddedToDualTypedList> myList = 
                     new ArrayList<CanBeAddedToDualTypedList> ()

编辑我还回答了您的相关问题,并展示了针对该特定案例使用通用界面的具体示例。

答案 2 :(得分:0)

Java generic在运行时不可用,因此java

无法实现

在Google上搜索“类型删除”,您会更好地理解它。

答案 3 :(得分:0)

您可以存储a_type.class对象,而不会帮助您使用泛型,它可用于添加其他运行时类型检查class.cast(...)

泛型不支持运行时类型,泛型类型本身在运行时不存在。 C#为每个通用类型List<String>都有一个运行时类,与List<int>不同。在java中,List<String>List<Integer>在运行时都不会降级为List

AFAIK(从未尝试过)扩展Generic类将类型存储在反射class StringList extends List<String>{}可访问的地方,StringList会记住用于扩展List的Generic类型。