0

List listofinteger类型Integer,但接受字符串对象,当我检查时instance of Integer,它给出的是真的,太奇怪了,谁能解释发生了什么。

我所知道的是,当我发送List listofintegerto 方法时,它会引用无类型的 List 引用变量,当我添加它时,它会将输入作为字符串,现在当我返回List listofanythingto时List of Integer type,它应该接受,因为它是一个引用。

现在,但我检查instanceof,它正在打印trueInteger但它的String

import java.util.ArrayList;
import java.util.List;

public class TestEx {

     List<Integer> listofinteger=new ArrayList<Integer>();      //list of integer type
     public static void main(String... args)
     {

         TestEx f=new TestEx();
         f.listofinteger.add(123);              //adds integer by wrapping it(auto)

         f.listofinteger=f.addelement(f.listofinteger);

         if(f.listofinteger.get(1) instanceof Integer);
         {
             System.out.println("true");                   //prints true here
             System.out.println(f.listofinteger.get(1));
         }



     }
      List<Integer> addelement(List listofanything)
     {
          listofanything.add("asdasdasd");            //adding String object

        return listofanything;
     }
}    

我知道addelement(List listofanything )这里的方法应该被赋予一个 Integer 类型,但我在这里测试它,以了解泛型的概念

4

3 回答 3

5

首先,正如@VJD 评论的那样,您有一个语法错误 - 不需要;

if(f.listofinteger.get(1) instanceof Integer);

关于您的问题,泛型是检查类型安全的编译时工具。在运行时没有验证,如类型 erasureString这就是为什么添加到Integers..列表时不会出错的原因

于 2013-06-03T07:43:04.277 回答
1

由于代码中的语法错误,您的程序打印true,这恰好是合法的,与您的意图不同。

你的if说法是

  if(f.listofinteger.get(1) instanceof Integer);

末尾的分号结束整个语句,并使其等效于传递一个空块:

  if(f.listofinteger.get(1) instanceof Integer) {
    // Do nothing
  }

之后,您拥有了本应属于 if 条件的块,但现在只是一个匿名块。(您可以在代码中或多或少地在任何地方添加大括号,以分隔语句以用于范围界定。它们仍然按标准顺序执行)。

将它们放在一起,您的代码相当于:

  if(f.listofinteger.get(1) instanceof Integer) {
    // Do nothing
  }

  System.out.println("true");                   //prints true here
  System.out.println(f.listofinteger.get(1));

所以应该清楚最后两行总是会被执行,不管if条件是什么。

正如其他人所指出的,您可以通过删除 if 语句后的分号来解决此问题。(而且由于这是一个令人困惑且难以发现的问题,许多静态分析工具(例如FindBugs)会将这些分号突出显示为可能存在的问题。)

于 2013-06-03T08:25:11.873 回答
0

您正在将您的列表作为通用列表传递...

如果添加字符串,您需要识别您的列表,List <Integer> listofanything因为您的代码会出错...我将您的addElement代码更改为:

List<Integer> addelement(List<Integer> listofanything)
 {
      listofanything.add("asdasdasd");            //Error when adding

    return listofanything;
 }

编译时出现错误...

于 2013-06-03T07:49:57.743 回答