Java 作为方法参数的广义列表

Java 作为方法参数的广义列表,java,arraylist,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) {

假设我有这样一个简单的类:

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;
}
然后我在主类中有一些简单的方法,如下所示:

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;
}
private static int findInList(__;list,String str){
对于(int i=0;i

如果在参数“代码>列表< /代码>的空白处放置<代码>列表<代码>,但如果我有其他对象怎么办?我是否可以对列表进行泛化,以便它可以用于除

BasicObject
之外的其他对象?如果是,如何获取列表中对象的类型

编辑:如果我有一个导入包中的另一个类,我仍然可以把它放在一个列表中,但我不想更改它实现了什么呢?有没有一种方法可以让通用的
findInList
也包含这些内容?还是我必须为这做另一种方法?我很乐意用另一种方法,但我很好奇这种方法是否可行

你试过检查吗?这就是您正在寻找的,您的方法签名应该如下所示:

public <T> List<T> findInList (Class<T> list, String str) {}
公共列表findInList(类列表,字符串str){}

如果所有对象都有公共父对象(BasicObject或具有getName()方法的任何其他类),则此操作将起作用


private static int findInList(List您可以使用这样的接口结构

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

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());
    }
}
公共接口IShape{
字符串getName();
}
公共类广场实现IShape{
私有字符串name=“Square”;
@凌驾
公共字符串getName(){
返回名称;
}
}
公共类圈实现IShape{
私有字符串name=“Circle”;
@凌驾
公共字符串getName(){
返回名称;
}
}
公共静态void main(字符串[]args){
列表=新的ArrayList();
添加(新的方块());
添加(新圆圈());
添加(新圆圈());
添加(新的方块());
list.add(新的IShape(){
@凌驾
公共字符串getName(){
返回“三角形”;
}
});
用于(IShape测试:列表){
System.out.println(test.getName());
}
}
这将产生如下输出

方格

方格

三角

作为编辑的答案


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

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

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;
}
并称之为

List<Named> stuff = ...;
String search = ...;
int index = findIndex(stuff, search,
    (named, s) -> s.equalsIgnoreCase(named.getName()));
List stuff=。。。;
字符串搜索=。。。;
int index=findIndex(填充、搜索、,
(named,s)->s.equalsIgnoreCase(named.getName());

什么类型的其他对象?是否要调用
getName()
?@ElliottFrisch是的,其他对象也要调用
getName()
。那些类/接口名称真的很混乱。好吧,假设我可以改变我想使用公共接口的想法Namable@NickZiebert当然,我想,那么就命名为impl1、2等?或者有什么想法吗?@NickZiebert好吧,保持原样:),为了理解,我觉得这是一个非常基本的例子:)