支架在前面

时间:2012-12-11 13:35:57

标签: java

以下是示例代码:

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)

5 个答案:

答案 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(...)中检索对象时,需要转换为列表中的对象。

所以基本上是它的描述