public interface IMessage { void publish(); } interface IErrorMessage extends IMessage{ StackTraceElement[] getStackTrace(); } interface IObjectFactory<E> { public <T extends E> T create(Class<T> theObjectType, Object[] theParameters); } class MessageFactory implements IObjectFactory<IMessage>{ public <T extends IMessage> T create(Class<T> theObjectType, Object[] theParameters) { return null; } } class Main { public static void main(String[] args) { IErrorMessage message = new MessageFactory().create(IErrorMessage.class, new Object[]{"Foo","Bar"}); } }