目标:我需要创建一个或多个函数来处理不同类型的 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/