Java 为什么将此ArrayList视为对象列表?

Java 为什么将此ArrayList视为对象列表?,java,arraylist,Java,Arraylist,如果我需要提供更多的代码,请告诉我,但是我在这段代码的最后一行遇到了语法错误,指出不兼容的类型;对象无法转换为字符串。我不明白为什么这个ArrayList被认为是由Objects而不是Strings组成的 正如您所知,inputList是从另一个方法传下来的,从这里开始只发布代码片段有点复杂,但据我所知,在其他地方,这些ArrayLists总是定义为Strings 任何意见(看看我在那里做了什么?)都将不胜感激 public static ArrayList<String> getU

如果我需要提供更多的代码,请告诉我,但是我在这段代码的最后一行遇到了语法错误,指出
不兼容的类型;对象无法转换为字符串
。我不明白为什么这个
ArrayList
被认为是由
Object
s而不是
String
s组成的

正如您所知,
inputList
是从另一个方法传下来的,从这里开始只发布代码片段有点复杂,但据我所知,在其他地方,这些
ArrayList
s总是定义为
String
s

任何意见(看看我在那里做了什么?)都将不胜感激

public static ArrayList<String> getURLsContainingTarget(ArrayList inputList, String target) throws MalformedURLException
{   
  ArrayList<String> outputList = new ArrayList<>();
  String regEx;
  regEx = "*" + target + "*"; 
  String line= "null";// this is a line in the web page
  // one loop to read through each URL in inputList 
  for (int i = 0; i < inputList.size() - 1; i++)
  {
    String URLline = inputList.get(i);
公共静态ArrayList getURLsContainingTarget(ArrayList inputList,String target)引发错误的ArrayList异常
{   
ArrayList outputList=新的ArrayList();
字符串正则表达式;
regEx=“*”+目标+“*”;
String line=“null”//这是网页中的一行
//一个循环,用于读取inputList中的每个URL
对于(int i=0;i
您的
inputList
是使用原始类型定义的-
ArrayList inputList
,这意味着,就编译器而言,它可能包含任何类型的对象。因此,
inputList.get(i)
返回
对象而不是
字符串,需要强制转换

如果将方法签名更改为:

public static ArrayList<String> getURLsContainingTarget(ArrayList<String> inputList, String target) throws MalformedURLException
公共静态ArrayList getURLsContainingTarget(ArrayList inputList,String target)引发错误的ArrayList异常
不需要铸造。

您可以做两件事:


  • 使
    inputList
    的类型更强。在函数参数列表中使用
    ArrayList inputList

  • 在使用点使用强制转换:
    String URLline=(String)inputList.get(i);


  • 请注意,(1)将导致编译时失败,而(2)如果
    inputList
    包含的对象不是
    String
    类型,则将导致运行时失败。因此,(1)将为您提供更高的程序稳定性,但(2)将更容易适应您的代码库,特别是如果您在许多地方使用函数
    getURLsContainingTarget

    如果您不定义
    ArrayList
    的类型,则它将被视为对象类型,因此您有两个选择:

    1:
    inputList
    定义为
    String
    like
    ArrayList inputList

    2: 把它像:
    String URLline=(String)inputList.get(i);

    如果不指定类型,则使用的是旧的非泛型版本。这基本等同于:


    ArrayList inputList=new ArrayList();

    ArrayList inputList
    作为参数也应该与
    一起使用。您必须定义
    String
    类型的
    ArrayList
    。否则它将被视为对象类型,因此您必须强制转换它。因为您有
    (ArrayList inputList
    而不是
    (ArrayList inputList
    我现在觉得自己很笨。有时候这真的需要一双额外的眼睛。谢谢!!另外,顺便说一句,工作到接口。在签名中使用列表,而不是ArrayList。谢谢你的详细回答!我使用了有效的选项1,但我没有意识到选项2也是可能的…(1)在我看来,如果你能重构对函数的所有调用,那就更好了。