我有两节课。其中一个类(Class_1)有一个返回List的方法:
class Class_1{
....
public List<String> method_1(){
Statement st = null;
ResultSet res = null;
List<String> tables = new ArrayList<String>();
try {
st = this.cnx.createStatement();
res = st.executeQuery("SHOW TABLES");
while(res.next()){
tables.add(res.getString(1));
}
}
catch(Exception e){
e.printStackTrace();
}
return tables;
}
}
当我编译这个(Class_1)类时,我没有得到任何错误或警告。但我有另一个类Class_2,它使用这个第一类。在第二节课中,我有这样的代码行:
class Class_2{
public static void main(String args[]){
Class_1 c = new Class_1();
List<String> some_list = c.method_1();
}
}
当我编写上面的类(Class_2)时,我现在得到这些警告,我不喜欢压制:
注意:Class_2.java使用未经检查或不安全的操作
注意:使用-Xlint重新编译:取消选中以获取详细信息
我想知道为什么我会收到这些错误,因为在我看来一切都应该没问题 - 一种方法明确只返回List<String>
,另一段代码尝试将此列表分配给变量输入List<String>
。我看不出,这里有什么不安全的地方。
修改
当我用-XLint:unchecked
编译我的Class_1时,我得到:
列出some_list = c.method_1();
^
必需:列出[String]
发现:列表
为什么?
修改
我做了一些调查,发现整个问题都在这一行:
tables.add(res.getString(1));
它似乎是一个字符串,但编译器不喜欢它。所以,如果我只是切换到:
tables.add("Some real string");
然后我没有收到任何警告。真奇怪。
答案 0 :(得分:2)
根据getString
类here ResultSet
方法的文档,该方法:
返回: 列值;如果值为SQL NULL,则返回的值为null
在这种情况下,null
中会插入List<String> tables
。这似乎是编译器抱怨的内容。
在添加到getString
之前,您应该检查null
是否返回List<String> tables
。
答案 1 :(得分:0)
请检查导入和数组
import java.util.Arrays;
import java.util.List;
public class c1 {
public List<String> method_1(){
List<String> my_list = Arrays.asList("a1", "b2"); //<- got a list by some procedure
return my_list;
}
}
和
import java.util.List;
public class c2 {
public static void main(String[] args) {
c1 obj = new c1();
List<String> s1 = obj.method_1();
System.out.println(s1);
}
}