Jan*_*omä 19 java generics language-construct
我最近偶然发现了一段像这样的代码:
Object o = .. ;
Foo foo = Foo.class.cast(o);
Run Code Online (Sandbox Code Playgroud)
我实际上甚至不知道java.lang.Class有一个强制转换方法,所以我查看了文档,从我收集的内容中,这只是对类对象所代表的类进行强制转换.所以上面的代码大致相当于
Object o = ..;
Foo foo = (Foo)o;
Run Code Online (Sandbox Code Playgroud)
所以我想知道,为什么我会想要使用强制转换方法而不是简单地进行"旧方法".有没有一个很好的例子,使用cast方法比简单的转换更有益?
我不认为它经常与你所展示的完全一样.我见过的最常见的用途是使用泛型的人试图做的相当于:
public static <T extends Number> T castToNumber(Object o) {
return (T)o;
}
Run Code Online (Sandbox Code Playgroud)
由于类型擦除,这并没有真正做任何有用的事情.
虽然这有效,但是类型安全(模数ClassCastExceptions):
public static <T extends Number> T castToNumber(Object o, Class<T> clazz) {
return clazz.cast(o);
}
Run Code Online (Sandbox Code Playgroud)
编辑:几个使用谷歌番石榴的例子:
在 Java 中,剥猫皮的方法通常不止一种。如果您有框架代码,此类功能可能会很有用。想象一个方法,它接受一个 Class 对象实例和一个 Object 实例,并返回 Object 实例作为类:
public static void doSomething(Class<? extends SomeBaseClass> whatToCastAs,Object o)
{
SomeBaseClass castObj = whatToCastAs.cast(o);
castObj.doSomething();
}
Run Code Online (Sandbox Code Playgroud)
一般来说,使用更简单的铸造,除非它不够。