Java中的转换不是魔术,而是告诉编译器A类型的对象实际上是更具体的B类型,从而访问B上的所有方法,否则就没有了。在执行强制转换时,您没有执行任何魔术或转换,您实际上是在告诉编译器“相信我,我知道我在做什么,我可以向您保证,此行中的这个对象实际上是一个<INSERT CAST type Here”。例如:Object o = "str";String str = (String)o;上面的一切都很好,不是魔法,一切都很好。存储在o中的对象实际上是一个字符串,因此我们可以在没有任何问题的情况下转换为字符串。有两种可能会出错的方法。首先,如果您在完全不同的继承层次结构中转换两种类型,那么编译器就会知道您很傻,并阻止了您:String o = "str";Integer str = (Integer)o; //Compilation fails here第二,如果它们在相同的层次结构中,但仍然是无效的强制转换,则ClassCastException将在运行时抛出:Number o = new Integer(5);Double n = (Double)o; //ClassCastException thrown here这实际上意味着您违背了编译器的信任。您已经告诉它,您可以保证对象是特定类型的,而它不是。你为什么需要演员?首先,您只需要在从更一般的类型到更特定的类型时才需要它。例如,Integer继承自Number,所以如果您想存储一个Integer作为Number那就可以了(因为所有的整数都是数字)。然而,如果你想反过来,你需要一个转换-不是所有的数字都是整数(以及我们的整数)。Double, Float, Byte, Long等等)而且,即使您的项目或JDK中只有一个子类,也可以很容易地创建另一个子类并分发它,所以即使您认为这是一个简单的、显而易见的选择,也无法保证!关于转换的使用,您仍然可以在一些库中看到对它的需求。PreJava-5在集合和各种其他类中大量使用,因为所有集合都在添加对象,然后转换出返回集合的结果。然而,随着泛型的出现,许多用于转换的用途已经消失-它已经被泛型所取代,它提供了一种安全得多的替代方案,没有ClassCastExceptions的潜力(实际上,如果您干净地使用泛型,并且它编译时没有警告,您就可以保证永远不会得到ClassCastException)。