通用允许String对象作为整数

时间:2013-06-03 07:39:06

标签: java string list generics integer

List listofinteger的类型为Integer,但接受字符串对象,当我检查instance of Integer时,它是真的,它太奇怪了,任何人都可以解释发生了什么。

我所知道的是,当我向方法发送List listofinteger时,它被赋予了对无类型的List引用变量的引用,当我添加它时将输入作为String,现在当我返回{{1}时} List listofanything,它应该采用,因为它是一个参考。

现在我检查List of Integer type,它正在为instanceof打印true,但Integer正在打印。

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; } } 应该给出一个Integer类型但是我在这里测试它,以理解泛型的概念

3 个答案:

答案 0 :(得分:5)

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

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

关于您的问题,泛型是编译时间工具,用于检查类型安全性。在运行时,从type erasure开始没有验证。这就是为什么在String

列表中添加Integers时没有错误的原因

答案 1 :(得分: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)会将这些分号突出显示为可能存在的问题。)

答案 2 :(得分:0)

您将列表作为通用列表传递......

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

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

    return listofanything;
 }

并且出现了错误编译......