2013-07-15 43 views
1

我有一个这样的接口:两种不同类型接口的实现 - 这是不可能的吗?

interface Transformer { 
    public String transform(List<Object> elements); 
} 

实现:

class XMLTransformer implements Transformer{ 
    public String transform(List<MyXMLElements> elements); 
} 

class TXTTransformer implements Transformer { 
    public String transform(List<MyTXTElements> elements); 
} 

但请注意,MyXMLElements和MyTXTElements没有一个共同的父。那些是完全不同的对象。

在界面中尝试这个还有:

public String transform(List<? extends Object> elements); 
    public String transform(List<?> elements); 
    public String transform(List<T extends Object> elements); 
    public String transform(List<T> elements); 

有没有办法来实现这一目标?

回答

1

您可以使用通用接口:

interface Transformer<T> { 
    public String transform(List<T> elements); 
} 

,使您的类实现一个泛型类型的不同实例:

class XMLTransformer implements Transformer<MyXMLElements> { 
    public String transform(List<MyXMLElements> elements) { 
    } 
} 

class TXTTransformer implements Transformer<MyTXTElements> { 
    public String transform(List<MyTXTElements> elements) { 
    } 
} 

这里,Transformer<MyXMLElements>是通用型Transformer<T>的一个实例。 Simlarly Transformer<MyTXTElements>是同一泛型类型的另一个实例。

+0

当我调用XML或TXT类型的方法时,它会自动识别使用哪个类/方法? –

+0

@KevinRave。对。究竟。对于使用'XMLTransformer'实例的'Transformer '引用,它将调用'XMLTransformer'中的方法。尝试实施它。 –

+0

谢谢@Rohit Jain! –

0

这是因为generics type erasure。对于JVM,您正在使用两种情况下的元素列表实现接口,这是完全可以接受的。

2

这应该是可能的仿制药 - 声明泛型类型参数的接口:

interface Transformer<T> { 
    public String transform(List<T> elements); 
} 

那么你的实现类只是有到位接口的泛型类型参数的使用实际的类名:

class XMLTransformer implements Transformer<MyXmlElements>{ 
    public String transform(List<MyXMLElements> elements) {} 
} 

class TXTTransformer implements Transformer<MyTXTElements> { 
    public String transform(List<MyTXTElements> elements) {} 
} 
相关问题