2012-09-15 97 views
0

我想写的方法可以接受类型a.A或b.B的参数。 目前,它的实现:不同类型的方法参数

import a.A; 
import b.B; 

... 
public void doSth(A arg) { 
     SpecificClass.specificMethod(arg); 
} 

public void doSth(B arg) { 
     SpecificClass.specificMethod(arg); 
} 

我想有一个通用的方法“doSth”使用通配符和只接受A.A或B.B。 重要信息a.A和b.B不是彼此的子类型。唯一的常见类型是java.lang.Object。

任何帮助?

回答

1

假设你可以这样做,如果A和B没有共同的超类,那么你将不能在参数上调用任何方法,而是调用对象的方法。

所以我认为,只有2个合理的解决方案是:

  • 有两种方法,一种为A和一个B(当前设置)
  • 有一个方法,接受一个对象作为参数,检查参数是一个instanceof A或B,如果没有抛出IllegalArgumentException
+0

我不确定是否无法通过通配符执行此操作。我发现常常使用'&'符号来限制参数必须实现/扩展'A&B'类。所以也许有可能用'|'做到这一点,但我不知道如何... – bontade

+2

@bontade泛型可以定义为类型的交集(使用'&'),但不能作为类型的联合。对于精美的打印,您可以查看[JLS 4.4](http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.4-200)。 – assylias

+0

太糟糕了@ @assylias谢谢你的帮助 – bontade

0
public <T> void doSth(T arg) { 
     SpecificClass.specificMethod(arg); 
} 

将被称为:

yourClass.doSth(yourarg); 

不过,这并不限制任何可以延伸对象,什么点都does.I建议兼具的类都实现一个共同的接口,然后程序到那个接口。

+0

我知道这一点。我试过类似'public void doSth(T arg)'但它没有编译,即使 – bontade

+0

@bontade实现一个接口将有助于 – NimChimpsky

+0

我无法修改a.A或b.B类。我使用已存在的类 – bontade

1

,你可以换A和B延伸的通用接口,就像:

interface CommonWrapper { 
    public void doSth(); 
} 

public class AWrapper implements CommonWrapper { 
    private A wrapped; 
    public AWrapper(A a) { 
    this.wrapped = a; 
    } 

    public void doSth() { 
    // implement the actual logic using a 
    } 
} 

public class BWrapper implements CommonWrapper { 
    private B wrapped; 
    public BWrapper(B b) { 
    this.wrapped = b; 
    } 

    public void doSth() { 
    // implement the actual logic using b 
    } 
} 

然后修改你的方法doSth接受CommonWrapper对象作为参数:

public void doSth(CommonWrapper c) { 
    c.doSth(); 
}