如何转换为泛型类型?

时间:2017-02-21 21:30:58

标签: java generics casting

以下代码会产生“未经检查或不安全的操作”警告,如何在不引起警告的情况下将Object o转换为T类型?我知道我可以压制警告,但我想知道“正确”的方式。

public class MyType<T> {
    T cast(Object o) {
        return (T)o; //<--- what causes the warning
    }
}

1 个答案:

答案 0 :(得分:8)

Type erasure。您可以将Class<T>作为参数传递,并使用它。像,

T cast(Class<T> cls, Object o) {
    return cls.cast(o);
}

甚至

public class MyType {
    public static <T> T cast(Class<T> cls, Object o) {
        return cls.cast(o);
    }
}

你可以像

一样打电话
int t = MyType.cast(Integer.class, 10);

或者,但在同一行,您可以在构造函数中传递Class,如

public class MyType<T> {
    public MyType(Class<T> cls) {
        this.cls = cls;
    }

    private Class<T> cls;

    T cast(Object o) {
        return cls.cast(o);
    }
}

然后像

一样使用它
MyType<Integer> myType = new MyType<>(Integer.class);
int t = myType.cast(10);