JUNEAU-160 Setting bean properties of type list don't use setters.
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanMapTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanMapTest.java
index 3b5c789..84b90d8 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanMapTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanMapTest.java
@@ -343,7 +343,7 @@
 

 		// The rest are proper superclasses of ObjectList.

 		assertEquals(ObjectList.class.getName(), m.get("l1").getClass().getName());

-		assertEquals(LinkedList.class.getName(), m.get("ll1").getClass().getName());

+		assertEquals(ObjectList.class.getName(), m.get("ll1").getClass().getName());

 		assertEquals(ObjectList.class.getName(), m.get("c1").getClass().getName());

 		assertEquals(ObjectList.class.getName(), m.get("jl1").getClass().getName());

 

@@ -358,7 +358,7 @@
 

 		// The rest are propert superclasses of ObjectMap

 		assertEquals(ObjectMap.class.getName(), m.get("m1").getClass().getName());

-		assertEquals(HashMap.class.getName(), m.get("hm1").getClass().getName());

+		assertEquals(ObjectMap.class.getName(), m.get("hm1").getClass().getName());

 		assertEquals(ObjectMap.class.getName(), m.get("jm1").getClass().getName());

 

 		// Initialized fields should reuse existing field value.

@@ -372,12 +372,12 @@
 		m.put("jm2", new ObjectMap("{foo:'bar'}"));

 		m.put("jl2", new ObjectList("[1,2,3]"));

 

-		assertEquals(ArrayList.class.getName(), m.get("l2").getClass().getName());

+		assertEquals(ObjectList.class.getName(), m.get("l2").getClass().getName());

 		assertEquals(ArrayList.class.getName(), m.get("al2").getClass().getName());

-		assertEquals(LinkedList.class.getName(), m.get("ll2").getClass().getName());

-		assertEquals(ArrayList.class.getName(), m.get("c2").getClass().getName());

-		assertEquals(HashMap.class.getName(), m.get("m2").getClass().getName());

-		assertEquals(HashMap.class.getName(), m.get("hm2").getClass().getName());

+		assertEquals(ObjectList.class.getName(), m.get("ll2").getClass().getName());

+		assertEquals(ObjectList.class.getName(), m.get("c2").getClass().getName());

+		assertEquals(ObjectMap.class.getName(), m.get("m2").getClass().getName());

+		assertEquals(ObjectMap.class.getName(), m.get("hm2").getClass().getName());

 		assertEquals(TreeMap.class.getName(), m.get("tm2").getClass().getName());

 		assertEquals(ObjectMap.class.getName(), m.get("jm2").getClass().getName());

 		assertEquals(ObjectList.class.getName(), m.get("jl2").getClass().getName());

@@ -1932,4 +1932,27 @@
 	public static class Z {

 		public String a, b, c;

 	}

+

+	//====================================================================================================

+	// testCollectionSetters_preferSetter

+	//====================================================================================================

+	@Test

+	public void testCollectionSetters_preferSetter() throws Exception {

+		AA aa = new AA();

+		BeanMap<AA> bm = BeanContext.DEFAULT.createSession().toBeanMap(aa);

+

+		bm.put("a", AList.create("x"));

+		assertObjectEquals("['x']", aa.a);

+	}

+

+	public static class AA {

+		private List<String> a = new ArrayList<>();

+

+		public List<String> getA() {

+			return Collections.emptyList();

+		}

+		public void setA(List<String> a) {

+			this.a = a;

+		}

+	}

 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index 99cfd3d..eb8c047 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -661,13 +661,16 @@
 

 				Object r = (beanContext.isBeanMapPutReturnsOldValue() || isMap || isCollection) && (getter != null || field != null) ? get(m, pName) : null;

 				Class<?> propertyClass = rawTypeMeta.getInnerClass();

+				ClassInfo pcInfo = rawTypeMeta.getInfo();

 

 				if (value == null && (isMap || isCollection)) {

 					invokeSetter(bean, pName, null);

 					return r;

 				}

 

-				if (isMap) {

+				Class<?> vc = value == null ? null : value.getClass();

+

+				if (isMap && (setter == null || ! pcInfo.isParentOf(vc))) {

 

 					if (! (value instanceof Map)) {

 						if (value instanceof CharSequence)

@@ -724,7 +727,7 @@
 					if (setter != null || field != null)

 						invokeSetter(bean, pName, propMap);

 

-				} else if (isCollection) {

+				} else if (isCollection && (setter == null || ! pcInfo.isParentOf(vc))) {

 

 					if (! (value instanceof Collection)) {

 						if (value instanceof CharSequence)