java - 通用辅助方法与直接类转换?

标签 java generics

我现在就是这样做的。

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/

相关文章:

java - 将泛型返回类型转换为接口(interface)类型

java - keyReleased 上出现 StackOverflowError,但 mouseReleased 工作正常

java - 我们可以创建一个通用类数组吗?

java - 检索泛型类型的类实例而不将泛型作为输入

java - 找不到符号 Java 多维数组

Java 泛型 : Bound mismatch. 寻找有效的替代品

swift - 基于消息的体系结构中的通用消息

java - Selenium :- In my application there is button whose id is getting randomly generated, 如何找到那个按钮

java - Eclipse Android Helloworld 空白

java - 通过jsp调用存储过程时出错