【问题标题】:Passing object of multiple types as parameter to a method将多种类型的对象作为参数传递给方法
【发布时间】:2016-09-21 07:59:30
【问题描述】:

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

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

同样,有没有什么方法可以在不使用继承的情况下实现如下?

public void passMultipleTypes(Type1 | Type2 obj) {
  ...
}

obj 对象可以是 Type1Type2我不想在这里使用继承,因为这些类是生成的,我无法更改它们。所以我不能将它们定义为

public class Test1 extends CommonSuperClass {
  ...
}

Type1Type2 具有相似的属性。所以我正在考虑使用obj,如下所示。

public void passMultipleTypes(Type1 | Type2 obj) {
  System.out.println(obj.getCode());
  System.out.println(obj.getValue());
}

【问题讨论】:

  • 在这里查看接受的答案:stackoverflow.com/questions/10777384/…
  • @Daneel 我不认为 OP 可以选择您建议的解决方案。生成了类,并且为这两个类实现接口可能很困难。
  • 检查泛型类型。

标签: java


【解决方案1】:

因为类是作为一些代码生成插件的一部分生成的。

您可以使用组合和继承来解决这个问题。

为 Type1 和 Type2 编写包装类,扩展为通用接口。

这将提供代码可重用性,并充当应用程序代码和第 3 方 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();

    }

【讨论】:

  • 请问如何在passMultipleTypes(T obj)中访问Type1Type2的方法
  • Type1 和 Type 2 应该实现一个通用接口。刚刚添加到我的答案中。
  • 那么这个不用引入泛型就可以实现。让类Type1Type2实现通用接口和passMultipleTypes(BasicType type)
【解决方案2】:

既然你不想使用继承,你可以使用方法重载。

public void passMultipleTypes(Type1 obj) {
  ...
}

public void passMultipleTypes(Type2 obj) {
 ...
}

如果您传递 Type1 的参数,将调用第一个方法。如果参数是 Type2,则将调用第二个参数。

【讨论】:

  • 是的,会的。但问题是不能修改类。这是唯一的其他方式。
  • 嗯,是的。我有你风格的当前方法。我问了这个问题是为了避免重复:-)
【解决方案3】:

如果您无法更改类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());
 }

“但是代码重复......”是的,没错。会有一些重复的代码。但是因为您无法更改原始代码,所以您无法以很好的方式解决它。只需将副本移至其他位置即可。

【讨论】:

  • 好吧。这个问题的唯一目的是避免重复。 :-)
  • 我知道,但不受“无法更改代码”的限制。
【解决方案4】:

您可以在Scala 中定义类似Either 类的自定义类型:

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 {

  }
}

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 2015-12-26
    • 2015-11-22
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    相关资源
    最近更新 更多