我有以下课程: Foo1 扩展 Bar 和 Foo2 扩展 Bar
我想在我的方法中传递 Foo1 或 Foo2 的类型来创建 Foo1 或 Foo2,如下所示:
public Bar createMethod( "either type of Foo1, or Foo2" fooType) {
//returns the foo1 or foo2
}
有什么方法可以实现这一目标吗?
答案 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);