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

时间:2020-12-20 19:14:59

标签: java oop

我有以下课程: Foo1 扩展 Bar 和 Foo2 扩展 Bar

我想在我的方法中传递 Foo1 或 Foo2 的类型来创建 Foo1 或 Foo2,如下所示:

public Bar createMethod( "either type of Foo1, or Foo2" fooType) {
    
    //returns the foo1 or foo2
}

有什么方法可以实现这一目标吗?

4 个答案:

答案 0 :(得分:1)

您可以通过声明使用泛型获得一些灵活性:

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);

答案 1 :(得分:1)

代码如下:

        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 扩展了 Bar。

答案 2 :(得分:0)

Java 没有联合类型,因此像 A | B 这样的类型在 Java 中是不可能的。

Java 15 通过 JEP 360 添加了密封类型,因此您可以创建只有两种无法扩展的类型的密封类型层次结构,从而有效地模拟您自己的类型的联合类型。

通过传递 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();
}

如果没有密封类型,您必须接受这样一个事实,即 3rd 方可能会扩展您的类型,从而使更多的类型成为方法的参数。

另一种可能性是使用字符串,并使用 Class.forName(String) 获取与完全限定类关联的类型:

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

答案 3 :(得分:-1)

您可以申报

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

然后调用

Bar bar = createMethod(Foo1.class);
相关问题