如何转换为泛型类型?

Tan*_*nia 2 java generics casting

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

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

Ell*_*sch 8

键入擦除.您可以将其Class<T>作为参数传递,并使用它.喜欢,

T cast(Class<T> cls, Object o) {
    return cls.cast(o);
}
Run Code Online (Sandbox Code Playgroud)

甚至

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

你可以称之为

int t = MyType.cast(Integer.class, 10);
Run Code Online (Sandbox Code Playgroud)

或者,但在同一行,您可以传递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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像使用它一样

MyType<Integer> myType = new MyType<>(Integer.class);
int t = myType.cast(10);
Run Code Online (Sandbox Code Playgroud)