这个函数如何不违反 Java 类型的安全要求?

How does this function not break Java type safety requirements?

我试图弄清楚 Android 中的一些 getParcelable() 类型函数是如何工作的,我能够将我的误解归结为这个简短的片段:

<T> T someFunction() {
    Object a = new Object();
    return (T)a;
}

void testSomeFunction() {
    String a = someFunction();
    List<Activity> activityLIst = someFunction();
    int[] intArray = someFunction();
}

为什么编译器允许这样做?对我来说,这似乎破坏了类型安全,而调用函数的代码不必强制转换 return 值。似乎您可以在技术上用

替换每个非 'void' return 参数
<T> T 

它会编译得很好(如果你没问题,运行 也很好)。有人知道 return 参数的特殊格式吗?

当然它会破坏类型安全,所有常见的 Java 编译器至少会在转换 (T) a 时输出警告。但是,一般来说,编译器不能总是追溯到 a 中存储的对象的创建来证明它 真的 是错误的类型,所以编译器不会实际上禁止这样做。