[英]Determine translated type for generics at runtime
我的问题与这里的问题完全相似。 就是这样,我想用Java做。
假设,我想列出一个列表:
List<a_type> myList = new ArrayList<a_type>();
问题是a_type
是什么,是根据条件决定的。 两种可能的类型是完全不相关的,没有超类但是Object是共同的。 如果我可以将Type存储在变量requiredType
并将其用作List<requiredType>
我的问题将得到解决。 我不确定我是不是只是贪婪,愚蠢或无知,但这就是情况。
虽然不重要,但这里解释了解释我为什么需要它的场景。
PS:请不要提及类型擦除。 请考虑这种情况。 我可以很好地在问题中提到它。 如果您认为存在设计问题,请仔细阅读此处的情况并提出替代方案。
这在Java中是不可能的,因为类型擦除并且由于泛型仅限于编译时间。
例如
List<Integer> integers = new ArrayList<Integer>();
在编译期间,当完成类型擦除时
List integers = new ArrayList();
泛型只是告诉编译器的一种方式,列表应该只处理Integer
类型的对象,如果你有某个地方试图为了类型安全而添加除Integer
以外的东西,那就让它指出来。
我能看到的唯一有效(如果“冒险”)方式,将类似于:
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> ()
编辑我还回答了您的相关问题,显示了针对该特定案例使用通用界面的具体示例。
Java泛型在运行时不可用,因此java无法实现
在谷歌上搜索“类型擦除”,你会更好地理解它。
您可以存储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类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.