package com.test; class Foo { } class Foo1 extends Foo { } class Foo2 extends Foo { } interface IBar { } interface BarFactory { > D make(Class barClass, Class fooClass, Class xmlClass); } class AbstractBar implements IBar { private BarFactory barFactory; public BarFactory getBarFactory() { return barFactory; } } class BarFactoryImpl implements BarFactory { @Override public > D make(Class barClass, Class fooClass, Class xmlClass) { // doesnt matter return null; } } class ConcreteBar1 extends AbstractBar { } public class Problem { public static void main(String[] args) { AbstractBar successeur = new BarFactoryImpl().make(ConcreteBar1.class, Foo1.class, String.class); } }