广义列表作为方法

时间:2017-03-27 02:19:40

标签: java arraylist

说我有一个像这样的简单类:

public class BasicObject {
    private String name;

    public BasicObject (String str) {
        name = str;
    }

    public String getName () {
        return name;
    }
}

然后我在主类中有一些简单的方法,如下所示:

private static int findInList (____ list, String str) {
    for (int i = 0; i < list.size(); i++) {
        if (list.get(i).getName().equalsIgnoreCase(str)) {
            return i;
        }
    }

    return -1;
}

如果我将List<BasicObject>放在参数list的空白处,它会起作用,但如果我有其他对象怎么办?我可以对列表进行概括,以便除了BasicObject之外还可以使用其他对象吗?如果是这样,我如何获得列表中对象的类型?

编辑:如果我从导入的包中有另一个类,我仍然可以放入列表但我不想改变它实现的内容怎么办?有没有办法让一般化findInList包括那些?或者我必须为此制作另一种方法?我只是制作另一种方法,但我很好奇这种方式是否可行。

4 个答案:

答案 0 :(得分:3)

您可以使用此

等界面结构

这样做提供了一个通用的调用结构,因此可以预测可以从实现中调用的内容

public interface IShape {
    String getName();
}

public class Square implements IShape {
    private String name = "Square";
    @Override
    public String getName() {
        return name;
    }
}

public class Circle implements IShape {
    private String name = "Circle";
    @Override
    public String getName() {
        return name;
    }
}

public static void main(String[] args){
    List<IShape> list = new ArrayList<>();
    list.add(new Square());
    list.add(new Circle());
    list.add(new Circle());
    list.add(new Square());
    list.add(new IShape() {
        @Override
        public String getName() {
            return "Triangle";
        }
    });

    for(IShape test : list){
        System.out.println(test.getName());
    }
}

这会产生这样的输出

  

     

     

     

     

三角

作为编辑的答案

是的,但需要反思,如果需要帮助,请在自行尝试解决问题后再打开一个新问题。

答案 1 :(得分:0)

您是否尝试过检查generics?这是您正在寻找的,您的方法签名应如下所示:

public <T> List<T> findInList (Class<T> list, String str) {}

答案 2 :(得分:0)

如果所有对象都有公共父对象(BasicObject或任何其他具有getName()方法的类),这将有效。

private static int findInList (List<? extends BasicObject> list, String str) {
    for (int i = 0; i < list.size(); i++) {
        if (list.get(i).getName().equalsIgnoreCase(str)) {
            return i;
        }
    }

    return -1;
}

答案 3 :(得分:0)

您的代码依赖于具有元素类型的列表,该方法具有编译器可见的getName方法。另一种方法是使用lambda。例如,

public interface Named {
  String getName();
}

public class UseNamed<T extends Named> {

public int findIndex(List<T> nameds, String search) {
  for (int len = nameds.size(), ix = 0; ix < len; ++ix) {
    final Named named = names.get(ix);
    if (search.equalsIgnoreCase(named.getName())) {
      return ix;
    }
  }
  return -1;
}

使用lambdas的一种方法是将比较器传递给findIndex

public <T, K> int findIndex(List<T> stuff, K search,
    BiFunction<T, K, Boolean> compares) {...}

并用

调用它
List<Named> stuff = ...;
String search = ...;
int index = findIndex(stuff, search,
    (named, s) -> s.equalsIgnoreCase(named.getName()));