Java 允许字符串对象作为整数的泛型

Java 允许字符串对象作为整数的泛型,java,string,list,generics,integer,Java,String,List,Generics,Integer,List-listofinteger类型为Integer,但接受字符串对象,当我检查Integer的实例时,它给出的是true,太奇怪了,有人能解释发生了什么吗 我所知道的是,当我将List List of Integer发送到方法时,它被赋予了对无类型的List reference变量的引用,当我添加它时,它将输入作为字符串,现在当我将任何事物的List List返回到整数类型的列表时,它应该被引用,因为它是一个引用 现在,我检查实例的,它正在为整数打印真,但它的字符串 import java

List-listofinteger
类型为
Integer
,但接受字符串对象,当我检查Integer的
实例时,它给出的是true,太奇怪了,有人能解释发生了什么吗

我所知道的是,当我将
List List of Integer
发送到方法时,它被赋予了对无类型的List reference变量的引用,当我添加它时,它将输入作为字符串,现在当我将任何事物的
List List
返回到整数类型的
列表时,它应该被引用,因为它是一个引用

现在,我检查
实例的
,它正在为
整数
打印
,但它的
字符串

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;
     }
}    
import java.util.ArrayList;
导入java.util.List;
公共类TestEx{
List listofinteger=new ArrayList();//整型列表
公共静态void main(字符串…参数)
{
TestEx f=新的TestEx();
f、 list of integer.add(123);//通过包装整数来添加整数(自动)
f、 listofinteger=f.addelement(f.listofinteger);
if(f.listofinteger.get(1)instanceof Integer);
{
System.out.println(“true”);//此处打印true
System.out.println(f.listofinteger.get(1));
}
}
列表添加元素(列出所有内容)
{
添加(“asdasdasd”);//添加字符串对象
返回所有内容的列表;
}
}    

我知道这里的方法
addelement(List List of Anything)
应该给出一个类型整数,但我在这里测试它,以理解泛型的概念首先,正如@VJD所评论的,您有一个语法错误-不需要
地址:

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

关于您的问题,泛型是编译时检查类型安全性的工具。在运行时中,没有验证。这就是为什么将
字符串添加到
整数列表中时不会出错的原因。

首先,正如@VJD所评论的,您有一个语法错误-不需要
地址:

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

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

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

您需要将您的列表标识为所有内容的列表。
对于您的代码,如果您添加了字符串,请给出一个错误。。。我将您的
addElement
代码更改为:

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

    return listofanything;
 }
List addelement(所有内容的列表)
{
listofanything.add(“asdasdasd”);//添加时出错
返回所有内容的列表;
}

编译时出现了一个错误

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

您需要将您的列表标识为所有内容的列表。
对于您的代码,如果您添加了字符串,请给出一个错误。。。我将您的
addElement
代码更改为:

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

    return listofanything;
 }
List addelement(所有内容的列表)
{
listofanything.add(“asdasdasd”);//添加时出错
返回所有内容的列表;
}

编译时出现了一个错误

您的程序打印
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语句后的分号来解决这个问题。(由于这是一个令人困惑且难以发现的问题,许多静态分析工具(如)将突出显示这些分号,认为这是一个可能的问题。)

由于代码中的语法错误,您的程序将打印
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语句后的分号来解决这个问题。(由于这是一个令人困惑且难以发现的问题,许多静态分析工具(如)将突出显示这些分号作为可能的问题。)

if(f.listofinteger.get(1)instanceof Integer)@VJD:这就是代码的问题,你应该把它作为一个答案发布。哦,分号是对的:/@VJD这是一个分号问题,我还有另一个问题,为什么它实际上允许字符串,如果java开发人员认为它会停止向列表中添加任何对象的问题,然后,首先,它们允许某种类型的列表引用简单类型的list@anshulkatta好的,您并没有将它添加到整数列表中,而是添加到一个列表中,它允许您添加它,尝试将所有内容的列表从一个列表更改为另一个列表,并选中if(f.listofinger.get(1)instanceof Integer)@VJD:这就是代码的问题所在,你应该把它作为答案发布。哦,分号是t