Java 泛型方法真的能够区分返回类型吗?

Java 泛型方法真的能够区分返回类型吗?,java,Java,在一些遗留代码中,我发现了以下方法: public static <T> T cast(Object o) {return (T) o;} publicstatictcast(objecto){return(T)o;} 这用于仅基于以下返回类型将任意对象强制转换为任何类型: List<SomeType> foo = cast(someObject); List foo=cast(someObject); 该强制转换方法如何能够强制转换为正确的类型?它不是 这是未经

在一些遗留代码中,我发现了以下方法:

public static <T> T cast(Object o) {return (T) o;}
publicstatictcast(objecto){return(T)o;}
这用于仅基于以下返回类型将任意对象强制转换为任何类型:

List<SomeType> foo = cast(someObject);
List foo=cast(someObject);
该强制转换方法如何能够强制转换为正确的类型?

它不是

这是未经检查的强制转换,如果您尝试强制转换的类型不对齐,则在运行时将失败

作为一个简单的例子,请观察当我们尝试使用此方法将
Integer
s列表强制转换为
biginger
s列表时会发生什么

List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5);

List<BigInteger> bigIntList = cast(intList);

for(BigInteger i : bigIntList) {
    System.out.println(i.doubleValue());
}
这个遗留代码被危险地破坏了,不应该依赖于任何类型的铸造。事实上,这种类型的转换应该由转换方法来处理


我应该注意-casting是告诉Java编译器,您不仅知道自己在做什么,而且还接受了失败的风险,这也是编译器不会警告您无效类型的原因之一。如果使用泛型正确地完成了这项工作(我不完全相信使用泛型是可能的),那么您将得到一个编译时警告,指出您做错了什么。

该方法没有任何作用。实际的施法在作业中进行

以下是您如何看到正在发生的事情:

public static <T> T cast(Object o) {
    try {
        return (T) o;
    } catch (ClassCastException cce) {
        // This never gets printed
        System.out.println("Cast has failed");
        throw cce;
    } finally {
        System.out.println("Cast succeeded");
    }
}

看起来该方法是阻止编译器抱怨错误类型的一种方法。我从来没有说过这是一个好方法做这样的事情,我只是惊讶于它真的没有抱怨的工作。(至少在Java7中是这样。)@michas好吧,Java的泛型是以“绅士协议”的方式实现的:在某些情况下,编译器不得不过于信任程序员。它实际上是生产系统的一部分。(这当然不会使事情变得更好…)作者确信对象包含合适的类型,但编译器抱怨道看来那是他取悦编译器的方式我只是感到惊讶,这真的使类型匹配毕竟,
T
似乎只能通过返回类型来推断。-我确信这是不可能的。是的-我在另一个答案中看了你的评论后,就加了一个关于这一点的简介。强制转换让您接管,您现在必须负责这些强制转换,因为编译器不是。
public static <T> T cast(Object o) {
    try {
        return (T) o;
    } catch (ClassCastException cce) {
        // This never gets printed
        System.out.println("Cast has failed");
        throw cce;
    } finally {
        System.out.println("Cast succeeded");
    }
}
List<SomeType> foo = cast(new Integer(5));
public static <T> T cast(Object o, Class<T> cls) {
    return cls.cast(o);
}