如何使用泛型矢量的强制转换方法。我想到的是像(Vector<T>).class.cast(getDates());
或(Vector<a_typeClass>).class.cast(getDates());
这样的模式,但它们不起作用。一个工作场所是循环所有元素。但必须有一种方法可以使用转换为泛型Vector。
(是的,我必须使用Vector,因为我正在扩展API)
编辑:这只是更复杂代码的一小部分。由于类型检查,演员表永远不会失败:if (Date.class.isAssignableFrom(a_typeClass))
。我也遗漏了样本中的null
支票。 Eclipse正在引发错误Type mismatch: cannot convert from Vector<Date> to Vector<T>
,因为它无法识别类型检查模式。
编辑:在我使用的示例中,isAssignable来自另一种方式。在Date.class.isAssignableFrom(a_typeClass)
现在a_typeClass.equals(Date.class)
之前。但是我仍然必须使用(Vector<T>)
强制转换,如果我不使用它,则会引发编译错误Type mismatch: cannot convert from Vector<Date> to Vector<T>
。感谢davmac和JB Nizet。
样品:
public class VectorCast {
@SuppressWarnings("unchecked")
public <T> Vector<T> getVector1(Class<T> a_typeClass) {
Vector<T> returnValues = new Vector<>();
if (a_typeClass.equals(Date.class)) {
returnValues = (Vector<T>) getDates();
// Not working
// return (Vector<T>).class.cast(getDates());
// return (Vector<a_typeClass>).class.cast(getDates());
}
return returnValues;
}
public Vector<Date> getDates() {
// Just dummy Values
return new Vector<Date>(Arrays.asList(new Date(0), new Date()));
}
public static void main(String[] args) {
VectorCast vectorCast = new VectorCast();
System.out.println(vectorCast.getVector1(Date.class));
}
}
解决样本:
public <T> Vector<T> getVector2(Class<T> a_typeClass) {
Vector<T> returnValues = new Vector<>();
if (a_typeClass.equals(Date.class)) {
for (Date date : getDates()) {
returnValues.add(a_typeClass.cast(date));
}
}
return returnValues;
}
答案 0 :(得分:0)
因此,如果我理解正确,您希望您的方法返回现有的Vector<Date>
,但如果作为参数传递的类为Vector<T>
,则为Date.class
,如果为Date.class
,则为空a_typeClass
作为参数传递的类不是Date
。这是一个非常奇怪的要求,但无论如何。
您在运行时检查T
是否可分配给Date
。但编译器对此没有任何线索。 Vector<T>
仍然是Vector<Date>
以外的其他类型,而a_typeClass
仍然是Date.class
以外的其他类型。所以你需要一个演员来让它快乐。
但即便如此,您的支票也不正确。为安全起见,java.sql.Timestamp.class
应等于至Vector<Date>
。我可以使用Vector<Timestamp>
作为参数调用您的方法,您的方法很乐意将get()
作为a_typeClass
返回。因此,调用者希望Vector包含Timestamp实例,并且他们将对返回的Vector进行的第一次Date.class
调用将因ClassCastException而失败。
所以,你可以做的是检查self.cam.release()
等于到self.cam
,然后将演员留在那里,这对于编译代码是绝对必要的,并且将始终未经检查,从而发出警告。
答案 1 :(得分:0)
你真的不能,因为类文字只适用于原始类。你必须做类似的事情:
Class<Vector<T>> c = (Class<Vector<T>>)(Object) Vector.class;
return c.cast(getDates());
这比你现在的演员阵容更清楚或更好。
问题的实质是Java的编译时类型检查不考虑控制流。您拥有的代码模式在Java中是不寻常的(也许是出于这个原因)。考虑重构以避免基于手动类型检查的不同行为。