@Test
public void testAbstractAndInterfaceTypes() {

	// interface
	RichMapFunction<String, ?> function = new RichMapFunction<String, Testable>() {
		private static final long serialVersionUID = 1L;
		@Override
		public Testable map(String value) throws Exception {
			return null;
		}
	};
	TypeInformation<?> ti = TypeExtractor.getMapReturnTypes(function, BasicTypeInfo.STRING_TYPE_INFO);
	Assert.assertTrue(ti instanceof GenericTypeInfo);
	// abstract class with out class member
	RichMapFunction<String, ?> function2 = new RichMapFunction<String, AbstractClassWithoutMember>() {
		private static final long serialVersionUID = 1L;
		@Override
		public AbstractClassWithoutMember map(String value) throws Exception {
			return null;
		}
	};
	ti = TypeExtractor.getMapReturnTypes(function2, BasicTypeInfo.STRING_TYPE_INFO);
	Assert.assertTrue(ti instanceof GenericTypeInfo);
	// abstract class with class member
	RichMapFunction<String, ?> function3 = new RichMapFunction<String, AbstractClassWithMember>() {
		private static final long serialVersionUID = 1L;
		@Override
		public AbstractClassWithMember map(String value) throws Exception {
			return null;
		}
	};
	ti = TypeExtractor.getMapReturnTypes(function3, BasicTypeInfo.STRING_TYPE_INFO);
	Assert.assertTrue(ti instanceof PojoTypeInfo);
}