说我有一个像这样的简单类:
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
包括那些?或者我必须为此制作另一种方法?我只是制作另一种方法,但我很好奇这种方式是否可行。
答案 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()));