0

我知道这是可能的,但有什么用?因为它只能投射与被投射对象相同的类型?

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;
4

3 回答 3

3

我在第一个中看到了一些用处。由于 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>实现中。

猜猜我在那里有点困惑,但希望它有所帮助。

于 2012-12-27T16:42:45.783 回答
0

书中的引文并没有说你以身作则。这本书说,只要类型参数相同,您就可以简单地应用正常的转换规则。

于 2012-12-27T16:52:25.357 回答
0

那么有什么用呢?

有很多用途。

例如,将通配符参数转换为特定参数或更具体的通配符参数:

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;
于 2012-12-27T19:56:51.943 回答