1

下面是示例代码:

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)

4

5 回答 5

3

这是一个强制转换——你告诉 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);

使用这种方法,我们放入列表和从列表中取出的所有内容都保证是一个字符串 - 其他任何内容,代码都不会编译。

于 2012-12-11T13:37:47.560 回答
2

这是一个强制转换,如果您在声明中使用泛型,则不是必需的List,例如

List<? extends Client>

现在您的循环将如下所示:

for (int i = 0; i < clientListFromFile.size(); i++) {
   Client dc = = clientListFromFile.get(i); 
}
于 2012-12-11T13:39:12.343 回答
1

这叫做演员表。您可以在此处找到有关它的更多信息。

于 2012-12-11T13:38:24.450 回答
1

这是一个明确的演员表。我想该列表更通用,因此代码明确地转换为该特定类型。

在某些情况下可以进行隐式转换(例如向上转换),但向下转换通常需要显式转换。

于 2012-12-11T13:38:39.627 回答
1

可能这两个列表都没有使用特定的类型,它们要么是 rawtypesList clientListFromFile = new ArrayList();要么正在使用List<Object>.

如果是这种情况,当您从列表中检索对象时,list.get(...)您需要转换为列表中的对象。

所以基本上它在那里描述的铸造

于 2012-12-11T13:39:26.863 回答