将未知的ArrayList类型传递给方法

时间:2015-10-13 15:53:16

标签: java arraylist

说我有这两个ArrayLists:

Example:

QString x = "free";
QString y = "dom";

x.append(y);
// x == "freedom"

ArrayList<Book> book = new ArrayList<>(); ArrayList<Journal> journal = new ArrayList<>(); Book是两个不同的类。

JournalBook个对象都有Journal方法。我想创建一个传入未知ArrayList类型的方法,并将传入的年份与列表中的对象进行比较。以下代码为main:

getYear()

如果将未知类型传递给方法,我就无法使用该对象的方法(public static void fooBar(int year, ArrayList<?> list) { if(list.get(0).getYear() == year) // does not work! { } } )。如果不制作两个执行相同操作的方法(一个用于getYear(),一个用于Book),我该怎么做呢?

4 个答案:

答案 0 :(得分:13)

您可以创建一个声明HasYear方法的接口(如果它尚不存在)(可能名为getYear()),并实现BookJournal

然后,您可以使用fooBar方法获取ArrayList某个类型参数的HasYear

public static void fooBar(int year, ArrayList<? extends HasYear> list)

? extends是由于它是消费者而不是生产者。

答案 1 :(得分:4)

就像JonK所说,如果他们共享一个定义getYear()的超类或接口,那么这将变得更容易。实际上, 拥有这两种关系中的任何一种来建立你的关系。

interface HasYear {
    public int getYear();
}

Book.java

public class Book implements HasYear{
    //...
    public int getYear(){/*YOUR IMPLEMENTATION*/}
}

Journal.java

public class Journal implements HasYear{
    //...
    public int getYear(){/*YOUR IMPLEMENTATION*/}
}

现在,您可以像这样创建和使用ArrayList:

public static void fooBar(int year, ArrayList<? extends HasYear> list){
    if(list.get(0).getYear() == year){
        //yay
    }
}

答案 2 :(得分:3)

BookJournal同时扩展一个公共超类(Publication?)或实现一个定义getYear()方法的公共接口:

public abstract class Publication {
    private int year;

    public int getYear() {
        return year;
    }

    public Publication(int year) {
        this.year = year;
    }
}

如果您随后更改了BookJournal类声明和构造函数:

public class Book extends Publication {

     public Book(int year, ...) {
         super(year);
         ...
     }
public class Journal extends Publication {

     public Journal(int year, ...) {
         super(year);
         ...
     }

然后,您可以传递Publication个对象的列表:

public void fooBar(int year, List<? extends Publication> list) { ... }

因为它Publication定义了getYear()方法,所以您可以在list中包含的对象上自由使用它。

答案 3 :(得分:1)

每个人都讨论了正确的方法,例如将对象与包含所需方法的超类相关联,但如果你想要一些不使用超类的花哨实现,你可以尝试lambda表达式:

ArrayList<Book> book = new ArrayList<>();
book.stream().limit(1).filter(s->s.getYear()==year).forEach(yourcode)

我知道这不是你想要的,但你有其他评论的正确解决方案。