说我有这两个ArrayLists:
Example:
QString x = "free";
QString y = "dom";
x.append(y);
// x == "freedom"
ArrayList<Book> book = new ArrayList<>();
ArrayList<Journal> journal = new ArrayList<>();
和Book
是两个不同的类。
Journal
和Book
个对象都有Journal
方法。我想创建一个传入未知ArrayList类型的方法,并将传入的年份与列表中的对象进行比较。以下代码为main:
getYear()
如果将未知类型传递给方法,我就无法使用该对象的方法(public static void fooBar(int year, ArrayList<?> list)
{
if(list.get(0).getYear() == year) // does not work!
{
}
}
)。如果不制作两个执行相同操作的方法(一个用于getYear()
,一个用于Book
),我该怎么做呢?
答案 0 :(得分:13)
您可以创建一个声明HasYear
方法的接口(如果它尚不存在)(可能名为getYear()
),并实现Book
和Journal
它
然后,您可以使用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)
让Book
和Journal
同时扩展一个公共超类(Publication
?)或实现一个定义getYear()
方法的公共接口:
public abstract class Publication {
private int year;
public int getYear() {
return year;
}
public Publication(int year) {
this.year = year;
}
}
如果您随后更改了Book
和Journal
类声明和构造函数:
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)
我知道这不是你想要的,但你有其他评论的正确解决方案。