如何使用泛型Vector <t>的cast()方法

时间:2016-07-02 14:01:58

标签: java generics types casting

如何使用泛型矢量的强制转换方法。我想到的是像(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;
}

2 个答案:

答案 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中是不寻常的(也许是出于这个原因)。考虑重构以避免基于手动类型检查的不同行为。