从Java 7开始,我们可以在同一个catch子句中捕获多个异常,如下所示。
UIDevice.beginGeneratingDeviceOrientationNotifications()
同样,如果不使用继承,有没有办法像下面这样实现?
try {
...
} catch( IOException | SQLException ex ) {
...
}
public void passMultipleTypes(Type1 | Type2 obj) {
...
}
对象可以是obj
或Type1
。 我不想在这里使用继承,因为这些类是生成的,我无法更改它们。所以我不能将它们定义为
Type2
public class Test1 extends CommonSuperClass {
...
}
和Type1
具有相似的属性。所以我正在考虑使用Type2
,如下所示。
obj
答案 0 :(得分:1)
因为类是作为某些代码生成插件的一部分生成的。
您可以使用合成和继承来解决此问题。
为Type1和Type2编写包装类,扩展到公共接口。
这将提供代码可重用性,并充当apllicaton代码和第三方API之间的层。
public class Testing {
public static void main(String[] args) {
Processor processor = new Processor();
processor.passMultipleTypes(new Type1Wraper());
processor.passMultipleTypes(new Type2Wrapper());
}
}
interface BasicType {
void operationOne();
void operationTwo();
}
class Type1 {
}
class Type2 {
}
class Type1Wraper implements BasicType {
private Type1 type;
@Override
public void operationOne() {
// type 1 method
}
@Override
public void operationTwo() {
// type 1 method
}
}
class Type2Wrapper implements BasicType {
private Type2 type;
@Override
public void operationOne() {
// type 2 method
}
@Override
public void operationTwo() {
// type 2 method
}
}
class Processor {
public void passMultipleTypes(BasicType object) {
object.operationOne();
object.operationTwo();
}
答案 1 :(得分:0)
由于您不想使用继承,因此可以使用方法重载。
public void passMultipleTypes(Type1 obj) {
...
}
public void passMultipleTypes(Type2 obj) {
...
}
如果传递Type1的参数,则会调用第一个方法。如果参数是Type2,则会调用第二个参数。
答案 2 :(得分:0)
如果您无法更改类Type1
和Type2
,那么只需使用重载方法:
public void passMultipleTypes(Type1 obj) {
System.out.println(obj.getCode());
System.out.println(obj.getValue());
}
public void passMultipleTypes(Type2 obj) {
System.out.println(obj.getCode());
System.out.println(obj.getValue());
}
“但代码重复......”是的,这是对的。会有一些重复的代码。但是因为你无法改变原始代码,所以你无法以很好的方式解决它。只需将复制移到另一个地方。
答案 3 :(得分:0)
您可以在Either
中定义类似Scala
类的cutom类型:
class Or<L,R>
{
private final Optional<L> left;
private final Optional<R> right;
...
}
所以你可以像这样使用这个类:
public void passMultipleTypes(Or<Type1, Type2> obj) {
if(obj.isLeft()) {
} else {
}
}