我知道这是可能的,但有什么用?因为它只能投射与被投射对象相同的类型?
class Example<X>{
//statements
}
//then this is declared
Example<Integer> x = new Example<Integer>();
//This is allowed
(Example<Integer>) x;
//this is not allowed, so what's the use?
(Example<Long>) x;
我在第一个中看到了一些用处。由于 java 在运行时决定类型,在这种特殊情况下,您可以将 x 声明为对象的实例,并通过在该行中向下转换它,您告诉编译器 x 确实是 Example。
我认为您的示例中不允许使用第二个,因为 Long 不是 Integer 的子类,更像是兄弟,因为我认为两者都继承自 Number。
所以,如果你做了类似的事情:
Example<Number> x = new Example<Number>();
(Example<Integer>) x;
(Example<Long>) x;
然后,如果您将 x 放入访问者之类的东西中,并且重载,您的 x 将落入您的Example<Long>
实现而不是您的Example<Integer>
实现中。
猜猜我在那里有点困惑,但希望它有所帮助。
书中的引文并没有说你以身作则。这本书说,只要类型参数相同,您就可以简单地应用正常的转换规则。
那么有什么用呢?
有很多用途。
例如,将通配符参数转换为特定参数或更具体的通配符参数:
Example<?> x;
Example<? extends Number> y;
Example<Integer> z;
y = (Example<? extends Number>)x;
z = (Example<Integer>)x;
z = (Example<Integer>)y;
或将实际类转换为更具体的类:
Example<Integer> x;
SubExample<Integer> y;
y = (SubExample<Integer>)x;