如何使用方法参数的类类型?

yrdbyhpb  于 2021-06-30  发布在  Java
关注(0)|答案(4)|浏览(235)

我有以下类:foo1扩展条和foo2扩展条
我想在方法中传递foo1或foo2的类型来创建foo1或foo2,如下所示:

public Bar createMethod( "either type of Foo1, or Foo2" fooType) {

    //returns the foo1 or foo2
}

有什么办法可以做到这一点吗?

ycl3bljg

ycl3bljg1#

代码如下:

public static void main(String args[]){

        Bar barB = createMethod(FooB.class);
        Bar barA = createMethod(FooA.class);

        System.out.println("barB is instance of B " + (barB instanceof FooB) );
        System.out.println("barA is instance of A " + (barA instanceof FooA) );

    }

    public static Bar createMethod(Class foo) {
        if(foo.equals(FooA.class)) {
            FooA fooA = new FooA();
            return (Bar) fooA;
        }
        else{
            FooB fooB = new FooB();
            return (Bar) fooB;
        }
    }

}

    class Bar{}

    class FooA extends Bar{}

    class FooB extends Bar{}

还有你的fooa和foob扩展条。

nnsrf1az

nnsrf1az2#

java没有联合类型,因此 A | B 在java中是不可能的。
java15通过jep360添加了密封类型,因此您可以创建一个密封类型层次结构,其中只有两个类型不能扩展,这有效地模拟了您自己类型的联合类型。
通过传递 Class ,然后可以使用反射来示例化类型。

public sealed interface FooBar permits Foo, Bar { }
public final class Bar implements FooBar { }
public final class Foo implements FooBar { }

public FooBar createMethod(Class<? extends FooBar> type) {
   return type.newInstance();
}

如果没有密封类型,您必须接受这样一个事实:第三方可能会扩展您的类型,从而使这两种类型不仅仅可以作为方法的参数。
另一种可能性是使用字符串 Class.forName(String) 要获取与完全限定类关联的类型,请执行以下操作:

public FooBar createMethod(String type) {
   if (type.equals("your.type.Foo") || type.equals("your.type.Bar"))
        return Class.forName(type).newInstance();
}
1tuwyuhd

1tuwyuhd3#

你可以申报

public Bar createMethod(Class<? extends Bar> fooType) {
    //returns the foo1 or foo2
}

然后打电话

Bar bar = createMethod(Foo1.class);
luaexgnf

luaexgnf4#

使用泛型可以有一定的灵活性,方法是声明:

public <T extends Bar> T createMethod(Class<T> foo) {
    // do the factoring
    retrun (T) foo1 // (or foo2 depending on the foo passed);
}

在此情况下,以下所有分配均有效:

Bar b1 = createMethod(Foo1.class);
Bar b2 = createMethod(Foo2.class);
Foo1 f1 = createMethod(Foo1.class);
Foo2 f2 = createMethod(Foo2.class);

注意:在运行时,您将得到 ClassCastException 如果不返回预期的类型。如果你这样做:

public <T extends Bar> T createMethod(Class<T> foo) {
    return (T)new Foo2();
}

Foo1 foo1 = createMethod(Foo1.class);

相关问题