private <C extends A> B polymorphicAdapt(C a) { String type = myKeyMap.getKey(a); if(type == null){ theLogger.warning("Unable to adapt, KeyMap returned null key."); return null; } Adapter<? extends A,B> adapter = myAdapterMap.get(type); if(adapter != null){ B b = null; try{ b = ((Adapter<C,? extends B>)adapter).adapt(a); if(b != null){ return b; } }catch(ClassCastException ex){ theLogger.log(Level.WARNING, "Found incompatible adapter for given class. Class: " + a.getClass() + ", Adapter: " + adapter, ex); return null; } theLogger.info( "Unable to adapt with specific adapter, returned null."); }else{ theLogger.info("No specifc adapter, using default adapter."); } return null; }