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{}
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();
}
4条答案
按热度按时间ycl3bljg1#
代码如下:
还有你的fooa和foob扩展条。
nnsrf1az2#
java没有联合类型,因此
A | B
在java中是不可能的。java15通过jep360添加了密封类型,因此您可以创建一个密封类型层次结构,其中只有两个类型不能扩展,这有效地模拟了您自己类型的联合类型。
通过传递
Class
,然后可以使用反射来示例化类型。如果没有密封类型,您必须接受这样一个事实:第三方可能会扩展您的类型,从而使这两种类型不仅仅可以作为方法的参数。
另一种可能性是使用字符串
Class.forName(String)
要获取与完全限定类关联的类型,请执行以下操作:1tuwyuhd3#
你可以申报
然后打电话
luaexgnf4#
使用泛型可以有一定的灵活性,方法是声明:
在此情况下,以下所有分配均有效:
注意:在运行时,您将得到
ClassCastException
如果不返回预期的类型。如果你这样做:和