Java 在运行时确定泛型的转换类型
我的问题与这个问题完全相似。就是这样,我想用Java来做 假设,我想将列表装箱为:Java 在运行时确定泛型的转换类型,java,generics,runtime,Java,Generics,Runtime,我的问题与这个问题完全相似。就是这样,我想用Java来做 假设,我想将列表装箱为: List<a_type> myList = new ArrayList<a_type>(); 列表 注:请不要提及类型擦除。请好好考虑一下情况。我完全可以在问题中提到这一点。如果您认为存在设计问题,请阅读情况并提出备选方案。这在Java中是不可能的,因为类型擦除以及泛型仅限于compiletime e、 g 泛型只是告诉编译器,列表应该只处理类型为Integer的对象的一种方式,如果为
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:请建议你是否有更好的选择。“你的设计有缺陷”似乎是这类问题在互联网上随处可见的热门话题:)有趣的是,这是一种情况,需要想出一个解决方案。是的,知道这一点。这就是为什么我认为我可以