将一个泛型类的实例转换为另一个使用的是什么?

时间:2012-12-27 16:29:56

标签: java generics types casting

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

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;

3 个答案:

答案 0 :(得分:3)

我看到第一个用了一些。由于java在运行时决定类型,在这种特殊情况下你可以将x声明为对象的实例,并通过在该行中向下转换它,你告诉编译器x实际上是Example。

我认为你的例子中不允许第二个,因为Long不是Integer的子类,更像是兄弟,因为我认为它们都继承自Number。

检查文档:Long || Integer

所以,如果你做过类似的事情:

Example<Number> x = new Example<Number>();

(Example<Integer>) x;
(Example<Long>) x;

然后,如果你将x放在像访问者那样的超载状态,你的x就会在你的Example<Long>实现中而不是Example<Integer>实现中出现。

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

答案 1 :(得分:0)

这本书的引用并没有说你通过例子来表达。该书说,只要类型参数相同,您就可以简单地应用正常的强制规则。

答案 2 :(得分: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;