【问题标题】:Generic allowing String Object as Integer泛型允许字符串对象作为整数
【发布时间】:2013-06-03 07:39:05
【问题描述】:

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

我所知道的是,当我将 List listofinteger 发送到方法时,它会引用无类型的 List 引用变量,当我添加它时,它会将输入作为字符串,现在当我将 List listofanything 返回到 @987654326 @ ,它应该是因为它是一个参考。

现在,但我检查 instanceof,它正在为 Integer 打印 true,但它是 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 )应该被赋予一个整数类型,但我在这里测试它,以了解泛型的概念

【问题讨论】:

  • if(f.listofinteger.get(1) instanceof Integer);
  • @VJD:那是代码的问题,您应该将其发布为答案。
  • 哦,分号是对的:/
  • @VJD 它是一个分号问题,好吧,我有另一个疑问,为什么它实际上允许一个字符串,如果 Java 开发人员认为它会阻止将任何对象添加到列表中的问题,那么在首先,他们允许成为某种类型的列表,以引用简单类型的列表
  • @anshulkatta 好吧,您不是将它添加到整数列表而是列表,它将允许您添加它,尝试将 listofanything 从 List 更改为 List 并检查

标签: java string list generics integer


【解决方案1】:

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

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

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

【讨论】:

  • 确实如此,但这里所做的验证与泛型无关。 OPs 代码的问题是语法错误。
  • @whoAMI 它是一个分号问题,好吧,我有另一个问题是为什么它实际上允许一个字符串,如果 Java 开发人员认为它会阻止将任何对象添加到列表中的问题,那么在首先,他们允许成为某种类型的列表,以引用简单类型的列表
  • 我并没有真正理解你的问题,但泛型是比 java 本身更晚的概念(在 java 1.5 中引入)。您可以尝试阅读我链接的问题以及网络上的更多内容。
【解决方案2】:

您的程序打印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)会将这些分号突出显示为可能存在的问题。)

【讨论】:

    【解决方案3】:

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

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

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

    编译时出现错误...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 2011-07-29
      • 2021-01-01
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 2010-11-13
      相关资源
      最近更新 更多