Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以通用方式根据值返回对象_Java_Inheritance_Switch Statement_Generic Programming - Fatal编程技术网

Java 以通用方式根据值返回对象

Java 以通用方式根据值返回对象,java,inheritance,switch-statement,generic-programming,Java,Inheritance,Switch Statement,Generic Programming,假设我有许多类,都从同一个类继承: public class A { ... } public class AA extends A { ... } public class AB extends A { ... } public class AC extends A { ... } 然后在代码的其他部分,我想返回一个子类,具体取决于发送到该函数的值,如下所示: public A getChild(int value, Object foo) { switch(v

假设我有许多类,都从同一个类继承:

public class A
{
  ...
}

public class AA extends A
{
  ...
}

public class AB extends A
{
  ...
}

public class AC extends A
{
  ...
}
然后在代码的其他部分,我想返回一个子类,具体取决于发送到该函数的值,如下所示:

public A getChild(int value, Object foo)
{
    switch(value)
    {
        case 0: {
            return new AA(foo);
        }
        case 1: {
            return new AB(foo);
        }
        case 2: {
            return new AC(foo);
        }
        default: {
          return new AA(foo);
        }
    }
}
在这个例子中,我只有3种类型的孩子。但是我可以假设其中30个,并且
switch
语句将变得巨大


使用
switch
语句和更通用的语句做同样的事情,有没有其他方法?与C中的函数指针类似,您可以使用整数值到函数接口的映射,这些函数接口创建
a
的各种子类的实例:

Map<Integer,Function<Object,A>> map = new HashMap<>();
map.put(0,f -> new AA(f));
map.put(1,f -> new AB(f));
...

在java中,C中也有类似的函数指针概念。 您可以使用Java反射(但效率不高):

您可以使用映射来保持“int-value”和“String-className”之间的关联。 但是这个解决方案并不有效!
相反,您可以使用Eran建议的函数图。

您不会遇到具有类似于
if-else
的行为的零件,因为您必须决定返回哪种
哪种类型的实例似乎很好!我需要更改代码中的一些内容,然后我将实现它并让您知道。谢谢:)建议您使用
Function@Eran我有一个问题想。如果子类具有多个参数,该怎么办?@souki此解决方案目前仅支持一个参数。如果需要多个参数,可以使用
映射
,让每个构造函数获取一个对象数组,但这会变得很难看。或者,如果所有的子类都使用多个参数,这些参数对所有子类来说都是相同的,那么您可以使用不同的函数接口而不是函数,来支持您需要的任意多的参数。好吧,是的,您是对的,这会变得很糟糕。希望它们都有相同的参数,所以使用不同的函数接口似乎适合我的需要。再次感谢您的建议!:)您检查了一些
异常
异常,这些异常应该得到处理
newInstance()
不带任何参数。
public A getChild(int value, Object foo) {
    return map.getOrDefault(value, f -> new AA(f)).apply(foo);
}
public A getChild(String className, Object foo)
{
   Class c = Class.forName(className);
   return (A) c.newInstance(Object foo);
}