Kevin Rave
Kevin Rave

Reputation: 14466

Two implementations for an interface with different types - Is this not possible?

I have an interface like this:

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

implementations:

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

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

But note that MyXMLElements and MyTXTElements do NOT have a common parent. Those are completely different objects.

Tried this as well in the interface:

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

Is there a way to achieve this?

Upvotes: 1

Views: 712

Answers (3)

Rohit Jain
Rohit Jain

Reputation: 213411

You can use generic interface:

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

And make your class implement different instantiations of that generic type:

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

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

Here, Transformer<MyXMLElements> is an instantiation of the generic type Transformer<T>. Simlarly Transformer<MyTXTElements> is another instantiation of the same generic type.

Upvotes: 1

rgettman
rgettman

Reputation: 178363

This should be possible with generics - declare a generic type parameter for your interface:

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

Then your implementing classes simply have to use the actual class name in place of the generic type parameter on the interface:

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

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

Upvotes: 2

Juned Ahsan
Juned Ahsan

Reputation: 68725

This is because of the generics type erasure. For JVM you are implemting the interfaces with List of elements in both the cases, which is totally acceptable.

Upvotes: 0

Related Questions