具有不同类型的接口的两种实现 - 这不可能吗?

时间:2013-07-15 18:32:03

标签: java generics methods types interface

我有这样的界面:

 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 );

有没有办法实现这个目标?

3 个答案:

答案 0 :(得分: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 ) {}
}

答案 1 :(得分: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>是同一泛型类型的另一个实例。

答案 2 :(得分:0)

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