java - 具有通用列表参数的函数? (重载功能)

标签 java android

目标:我需要创建一个或多个函数来处理不同类型的 List参数,我将迭代函数中的列表。

尝试:

1-具有不同类型列表的多个函数

public static int update(List<MyClass> myClasses){};
public static int update(List<Project> rojects){};
public static int update(List<Time> times){};

但是由于多个具有相同参数类型的函数,这被认为是不可编译的 List .

2- 列表的通用类型,并使用 ( instanceof ) 但是,我未能完全做到这一点,因为我不确定如何做到这一点,而且据我所知,这似乎是这种操作的不利方式。

我的问题:Java实现这种需求的方式是什么?我需要一个干净的代码,我不在乎它是否复杂,我最关心的是准确性和正确的编码。

PS:如果instanceof正确的方法,那么请您向我提供一个关于如何使用不同类型迭代列表的小示例。

提前致谢:)

编辑:不同的对象彼此没有关系,因为它们不相互扩展,也不扩展父类(super class)。每个函数的 block 都会生成一个 SQLite 语句,该语句对于每种类型都是不同的。


回应“严厉”的回答:

所以我最终结合了你的建议,那就是实现一个具有 getClassType() 函数的基类。它返回类名的字符串,然后我将检查 update(List<T> list) 中的返回值功能。

public static <T extends Item> int update(List<T> list){
    ...
    // Loop through the list and call the update function
    for (T item: list){
        if (item.getClassType() == MyClass.CLASS_TYPE)
            update((MyClass) item);

    }
    ...
}

public interface Item {
    /**
     * @return Return the class type, which is the name of the class
     */
    public String getClassType();
}

public class ClassProject implements Item{
    public static final String CLASS_TYPE = "ClassProject";
    @Override
    public String getClassType() {
        return CLASS_TYPE;
    }
    ...
}

public class ClassTime implements Item{
    public static final String CLASS_TYPE = "ClassTime";
    @Override
    public String getClassType() {
        return CLASS_TYPE;
    }
    ...
}

public class MyClass implements Item{
    public static final String CLASS_TYPE = "MyClass";
    @Override
    public String getClassType() {
        return CLASS_TYPE;
    }
    ...
}

这样做的原因 interface是因为我不喜欢istanceof不确定它的性能和成本,所以我尝试自己制作一个。现在这样做是不是很糟糕?

最佳答案

你能做这样的事情吗:

public class Update<T>
{

public static int update(List<T> objects){};

}

或者

public static <T> int update(List<T> objects){};

哪个更适合您的情况。

因此,如果您采用第二种方法并且由于运行时的类型删除,您将只剩下instanceof检查:

public static <T> int update(List<T> objects){
        for(T object : objects)
        {
            if(object.getClass().isInstance(Pair.class))
            {
                //do something
            }else if(object.getClass().isInstance(Time.class))
            {

            }
        }
        return 0;
    }

但这看起来不是一个好的设计,您可以使用工厂方法来改进:

    static Handler getHandler(Class<?> handlerClass)
        {
            if(handlerClass.isInstance(Project.class))
            {
                //return ProjectHandler
            }else if(handlerClass.isInstance(Time.class))
            {
                //return TimeHandler
            }
            //return errorHandler
        }
        interface Handler {
            int handle();
        }
       public static <T> int update(List<T> objects){
            for(T object : objects)
            {
                getHandler(object.getClass()).handle();
            }
            return 0;
        }

现在,IMO 更好的方法是通过标记接口(interface)指定更新下的类,然后干净地处理每个类中的更新:

    interface Updateable {
        int update();
    }

    public static <T extends Updateable> int update2(List<T> objects){
        for(T object : objects)
        {
            object.update();
        }
        return 0;
    }

关于java - 具有通用列表参数的函数? (重载功能),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16648252/

相关文章:

java - ArrayList 打印重复值

android - OpenCV 标志检测 - 使用什么?

android - Showcase View 文字引力

java - 忽略文件中以 "#"登录 Java 开头的行

Java字符串分割成数组,我应该存储在变量中吗?

java - 使用 ExecutorService 时不会调用 Thread.interrupt

android - FB sdk导致Jar不匹配

java - Android Audio - 流式正弦音发生器奇怪的行为

android - 请求失败,http statusCode :422, 异常 :org. apache.http.client.HttpResponseException:不可处理的实体

java - 从 JUnit 测试自连接到 Websocket Spring 服务器