我的问题与here完全相似。就是这样,我想用Java做。
假设,我想列出一个列表:
List<a_type> myList = new ArrayList<a_type>();
问题是a_type
将是什么,是根据条件决定的。两种可能的类型是完全不相关的,没有超类但是Object是共同的。如果我可以将Type存储在变量requiredType
中并将其用作List<requiredType>
,我的问题就会得到解决。我不确定我是不是只是贪婪,愚蠢或无知,但这就是情况。
虽然不重要,但解释了我需要它的原因的场景解释here。
PS:请不要提及类型擦除。请考虑这种情况。我可以很好地在问题中提到它。如果您认为存在设计问题,请仔细阅读情况here并提出替代方案。
答案 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类型。