将多种类型的对象作为参数传递给方法

时间:2016-09-21 07:59:30

标签: java

从Java 7开始,我们可以在同一个catch子句中捕获多个异常,如下所示。

UIDevice.beginGeneratingDeviceOrientationNotifications()

同样,如果不使用继承,有没有办法像下面这样实现?

try { 
  ...
} catch( IOException | SQLException ex ) { 
  ...
}

public void passMultipleTypes(Type1 | Type2 obj) { ... } 对象可以是objType1我不想在这里使用继承,因为这些类是生成的,我无法更改它们。所以我不能将它们定义为

Type2

public class Test1 extends CommonSuperClass { ... } Type1具有相似的属性。所以我正在考虑使用Type2,如下所示。

obj

4 个答案:

答案 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)

如果您无法更改类Type1Type2,那么只需使用重载方法:

 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 {

  }
}