我现在就是这样做的。
static <T extends Some> T doSome(Class<T> type, T obj) {
// pre-existing legacy method
// omitted for brevity
}
private static <T extends Some> T doSomeHelper(Class<T> type, Some obj) {
// private!
// only invoked from doSome(T)
return doSome(type, type.cast(obj));
}
@SuppressWarnings("unchecked")
static <T extends Some> T doSome(T obj) {
return (T) doSomeHelper(obj.getClass(), obj);
}
我刚刚发现下面的方法编译器也没有问题。
@SuppressWarnings("unchecked")
public static <T extends Some> T doSome_(T obj) {
return doSome((Class<T>) obj.getClass(), obj);
}
哪种方法更好?
最佳答案
第一种方法更好,因为所有类型在理论层面上都是正确的。
第二种方式, Actor (Class<T>) obj.getClass()
理论上是不正确的。 obj
的实际运行时类可以是 T
的任何子类型,因此 obj.getClass()
可以是Class<some subtype of T>
,与 Class<T>
不兼容。由于类型删除,强制转换实际上不会在运行时失败,但您不应该编写理论上不正确的代码。
关于java - 通用辅助方法与直接类转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35534060/