以下是示例代码:
for(int i = 0; i < clientListFromFile.size(); i++)
{
DisplayClient dc = null; // DisplayClient is another class
dc = (DisplayClient)clientListFromFile.get(i); // clientListFromFile is the a list.
}
我可以知道将Displayclient
放在clientListFromFile
前面的方法是什么?
int prevID = (int)clientList.get(clientListCount-1);
这是另一个例子。为什么要放(int) infront clientList.get(clientListCount-1)
?
答案 0 :(得分:4)
这是一个演员 - 你告诉Java这个变量的类型可能比编译时知道的更具体。这带来了一定程度的危险,因为你必须在运行时检查它肯定是那种类型,否则会抛出异常。
在引入仿制药之前,这曾经被广泛使用,特别是在收藏品中。但是,泛型在编译时提供了更大程度的定义类型,因此不再需要许多强制转换。如果您在从列表中检索项目时发现需要强制转换,则可能无法正确地(或根本不)声明泛型类型,并应考虑修复此问题。
以下代码使用旧语法,没有泛型。注意最后一行是如何编译的,因为编译器对列表的类型一无所知,所以类型总是对象。因此,我们需要一个演员才能让它发挥作用。
List list = new ArrayList();
list.add("hello");
String s = list.get(0); //Doesn't compile
String s = (String)list.get(0); //Does compile
现在不鼓励使用这种方法,实际上只是出于向后兼容的原因,这仍然是允许的(这是在引入泛型之前做事的唯一方法。)我们必须记住列表的类型,放入的内容和相应地施放 - 如果不是字符串的东西进入列表,没有什么能阻止它。以下示例使用泛型,因此不再使用强制转换:
List<String> list = new ArrayList<String>();
list.add("hello");
String s = list.get(0);
使用这种方法,我们放入列表并退出列表的所有内容都保证是一个字符串 - 其他任何内容都不会编译。
答案 1 :(得分:2)
这是一个演员阵容。您可以找到有关它的更多信息here。
答案 2 :(得分:2)
这是一个明确的演员。我想这个列表更通用,所以代码显式地转换为该特定类型。
在某些情况下可以进行隐式投射(例如,向上投射),但是向下投射通常需要显式投射。
答案 3 :(得分:2)
这是演员表,如果您在List
声明中使用泛型,则不需要,例如
List<? extends Client>
现在你的循环看起来像是:
for (int i = 0; i < clientListFromFile.size(); i++) {
Client dc = = clientListFromFile.get(i);
}
答案 4 :(得分:1)
可能两个列表都没有使用特定类型,它们是rawtypes List clientListFromFile = new ArrayList();
或者他们正在使用List<Object>
。
如果是这种情况,当您从列表list.get(...)
中检索对象时,需要转换为列表中的对象。
所以基本上是它的描述