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类型但是我在这里测试它,以理解泛型的概念
答案 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;
}
并且出现了错误编译......