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好吧,保持原样:),为了理解,我觉得这是一个非常基本的例子:)