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

Java 在运行时确定泛型的转换类型,java,generics,runtime,Java,Generics,Runtime,我的问题与这个问题完全相似。就是这样,我想用Java来做 假设,我想将列表装箱为: List<a_type> myList = new ArrayList<a_type>(); 列表 注:请不要提及类型擦除。请好好考虑一下情况。我完全可以在问题中提到这一点。如果您认为存在设计问题,请阅读情况并提出备选方案。这在Java中是不可能的,因为类型擦除以及泛型仅限于compiletime e、 g 泛型只是告诉编译器,列表应该只处理类型为Integer的对象的一种方式,如果为

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

假设,我想将列表装箱为:

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



注:请不要提及类型擦除。请好好考虑一下情况。我完全可以在问题中提到这一点。如果您认为存在设计问题,请阅读情况并提出备选方案。

这在Java中是不可能的,因为类型擦除以及泛型仅限于compiletime

e、 g


泛型只是告诉编译器,列表应该只处理类型为
Integer
的对象的一种方式,如果为了类型安全,您尝试添加了
Integer
以外的对象,让我们指出这一点。

这在Java中是不可能的,由于类型擦除和泛型仅限于compiletime这一事实

e、 g


泛型只是告诉编译器,列表应该只处理类型为
Integer
的对象的一种方式,如果为了类型安全,您尝试添加了
Integer
以外的对象,那么让我们指出这一点。

Java泛型在运行时不可用,因此Java不可能


在谷歌上搜索“类型擦除”,你会更好地理解它。

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


在谷歌上搜索“类型擦除”,你会更好地理解它。

你可以存储
a_Type.class
对象,虽然这对泛型没有帮助,但它可以用来添加额外的运行时类型检查
class.cast(…)

泛型不支持运行时类型,泛型类型本身在运行时不存在。C#为每个泛型类型都有一个运行时类
List
不同于
List
。在java中,
List
List
在运行时都降级为
List


AFAIK(从未尝试过)扩展泛型类将类型存储在反射
类StringList Extendes List{}
可访问的某个位置,StringList会记住用于扩展列表的泛型类型

您可以存储
a_type.class
对象,虽然这对泛型没有帮助,但它可以用于添加额外的运行时类型检查
class.cast(…)

泛型不支持运行时类型,泛型类型本身在运行时不存在。C#为每个泛型类型都有一个运行时类
List
不同于
List
。在java中,
List
List
在运行时都降级为
List

AFAIK(从未尝试过)扩展泛型类将类型存储在反射
类StringList Extendes List{}
可访问的某个位置,StringList会记住用于扩展列表的泛型类型

我能看到的唯一有效(如果“有风险”)的方法是类似于:

     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…");
     }
listmylist=newarraylist();
/* … */
最终对象o=myList.get(0);
if(o OneType的实例){
一型o1=(一型)o;
/* … */
}else if(其他类型的o实例){
OtherType o2=(OtherType)o;
/* … */
}否则{
抛出新的RuntimeException(“在列表中找到意外类型…”);
}
您可能希望在代码中添加@SuppressWarnings

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

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


     List<CanBeAddedToDualTypedList> myList = 
                     new ArrayList<CanBeAddedToDualTypedList> ()
公共接口可以添加到UALTypedList{};
公共类OneType实现了CanbeadedTodualTypeList{…};
公共类OtherType实现可以添加到TualTypeList{…};
列表myList=
新ArrayList()
编辑我还回答了您的相关问题,展示了在特定情况下使用通用界面的具体示例。

我所能看到的唯一有效(如果“有风险”)的方法类似于:

     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…");
     }
listmylist=newarraylist();
/* … */
最终对象o=myList.get(0);
if(o OneType的实例){
一型o1=(一型)o;
/* … */
}else if(其他类型的o实例){
OtherType o2=(OtherType)o;
/* … */
}否则{
抛出新的RuntimeException(“在列表中找到意外类型…”);
}
您可能希望在代码中添加@SuppressWarnings

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

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


     List<CanBeAddedToDualTypedList> myList = 
                     new ArrayList<CanBeAddedToDualTypedList> ()
公共接口可以添加到UALTypedList{};
公共类OneType实现了CanbeadedTodualTypeList{…};
公共类OtherType实现可以添加到TualTypeList{…};
列表myList=
新ArrayList()

编辑我还回答了您的相关问题,并给出了一个具体的例子,说明如何在特定情况下使用通用接口。

这在Java中是不可能的,如果您的设计需要这样做,我甚至会说您的设计是有缺陷的…@JarrodRoberson:请建议您是否有更好的选择。“你的设计有缺陷”似乎是这类问题在互联网上随处可见的热门话题:)有趣的是,这是一种情况,需要想出一个解决方案。这在Java中是不可能的,我甚至可以说你的设计有缺陷,如果需要的话…@JarrodRoberson:请建议你是否有更好的选择。“你的设计有缺陷”似乎是这类问题在互联网上随处可见的热门话题:)有趣的是,这是一种情况,需要想出一个解决方案。是的,知道这一点。这就是为什么我认为我可以