fix both parser and emitter for issue 61
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
index 691333d..601f8ed 100644
--- a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
+++ b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
@@ -22,6 +22,7 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.ArrayList;
@@ -273,7 +274,8 @@
                     if (!typeDetected && valueNode.getNodeId() != NodeId.scalar) {
                         // only if there is no explicit TypeDescription
                         Type[] arguments = property.getActualTypeArguments();
-                        if (arguments != null) {
+                        if (arguments != null && !(arguments[0] instanceof TypeVariable)) {
+                            // TODO check non Java HotSpot(TM) Server VM
                             // type safe (generic) collection may contain the
                             // proper class
                             if (valueNode.getNodeId() == NodeId.sequence) {
diff --git a/src/main/java/org/yaml/snakeyaml/representer/Representer.java b/src/main/java/org/yaml/snakeyaml/representer/Representer.java
index af6d0b1..5fb4bb9 100644
--- a/src/main/java/org/yaml/snakeyaml/representer/Representer.java
+++ b/src/main/java/org/yaml/snakeyaml/representer/Representer.java
@@ -179,13 +179,9 @@
     @SuppressWarnings("unchecked")
     protected void checkGlobalTag(Property property, Node node, Object object) {
         Type[] arguments = property.getActualTypeArguments();
-        if (arguments != null) {
+        if (arguments != null && !(arguments[0] instanceof TypeVariable)) {
             if (node.getNodeId() == NodeId.sequence) {
                 // apply map tag where class is the same
-                if (arguments[0] instanceof TypeVariable) {
-                    // generic collections need the tag
-                    return;
-                }
                 Class<? extends Object> t = (Class<? extends Object>) arguments[0];
                 SequenceNode snode = (SequenceNode) node;
                 List<Object> memberList = (List<Object>) object;
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericBeanTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericListBeanTest.java
similarity index 65%
rename from src/test/java/org/yaml/snakeyaml/issues/issue61/GenericBeanTest.java
rename to src/test/java/org/yaml/snakeyaml/issues/issue61/GenericListBeanTest.java
index 727254f..06d91f9 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericBeanTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericListBeanTest.java
@@ -22,9 +22,11 @@
 import junit.framework.TestCase;

 

 import org.yaml.snakeyaml.JavaBeanDumper;

+import org.yaml.snakeyaml.JavaBeanLoader;

 import org.yaml.snakeyaml.Util;

 

-public class GenericBeanTest extends TestCase {

+public class GenericListBeanTest extends TestCase {

+    @SuppressWarnings("unchecked")

     public void testGenericList() throws Exception {

         JavaBeanDumper beanDumper = new JavaBeanDumper();

         ListProvider<String> listProvider = new ListProvider<String>();

@@ -34,13 +36,14 @@
         // System.out.println(s);

         assertEquals("list:\n- foo\n- bar\n", s);

         // parse

-        // JavaBeanLoader<ListProvider> loader = new

-        // JavaBeanLoader<ListProvider>(ListProvider.class);

-        // ListProvider listProvider2 = loader.load(s);

-        // assertEquals("foo", listProvider2.getList().get(0));

-        // assertEquals("bar", listProvider2.getList().get(1));

+        JavaBeanLoader<ListProvider> loader = new JavaBeanLoader<ListProvider>(ListProvider.class);

+        ListProvider<String> listProvider2 = loader.load(s);

+        assertEquals("foo", listProvider2.getList().get(0));

+        assertEquals("bar", listProvider2.getList().get(1));

+        assertEquals(listProvider, listProvider2);

     }

 

+    @SuppressWarnings("unchecked")

     public void testGenericBean() throws Exception {

         JavaBeanDumper beanDumper = new JavaBeanDumper();

         ListProvider<Bean> listProvider = new ListProvider<Bean>();

@@ -55,6 +58,15 @@
         // System.out.println(s);

         String etalon = Util.getLocalResource("issues/issue61-1.yaml");

         assertEquals(etalon, s);

+        // parse

+        JavaBeanLoader<ListProvider> loader = new JavaBeanLoader<ListProvider>(ListProvider.class);

+        ListProvider listProvider2 = loader.load(s);

+        Bean foo2 = (Bean) listProvider2.getList().get(0);

+        assertEquals("foo", foo2.getName());

+        assertEquals(0, foo2.getNumber());

+        Bean bar2 = (Bean) listProvider2.getList().get(1);

+        assertEquals("bar", bar2.getName());

+        assertEquals(3, bar2.getNumber());

     }

 

     public static class ListProvider<T> {

@@ -67,6 +79,21 @@
         public void setList(List<T> list) {

             this.list = list;

         }

+

+        @SuppressWarnings("unchecked")

+        @Override

+        public boolean equals(Object obj) {

+            if (obj instanceof ListProvider) {

+                return list.equals(((ListProvider) obj).getList());

+            } else {

+                return false;

+            }

+        }

+

+        @Override

+        public int hashCode() {

+            return list.hashCode();

+        }

     }

 

     public static class Bean {

@@ -89,5 +116,4 @@
             this.number = number;

         }

     }

-

 }

diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericMapBeanTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericMapBeanTest.java
new file mode 100644
index 0000000..859fa67
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericMapBeanTest.java
@@ -0,0 +1,119 @@
+/**

+ * Copyright (c) 2008-2010 Andrey Somov

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *     http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+

+package org.yaml.snakeyaml.issues.issue61;

+

+import java.util.HashMap;

+import java.util.Map;

+

+import junit.framework.TestCase;

+

+import org.yaml.snakeyaml.JavaBeanDumper;

+import org.yaml.snakeyaml.JavaBeanLoader;

+import org.yaml.snakeyaml.Util;

+

+public class GenericMapBeanTest extends TestCase {

+    @SuppressWarnings("unchecked")

+    public void testGenericMap() throws Exception {

+        JavaBeanDumper beanDumper = new JavaBeanDumper();

+        MapProvider<String, Integer> listProvider = new MapProvider<String, Integer>();

+        listProvider.getMap().put("foo", 17);

+        listProvider.getMap().put("bar", 19);

+        String s = beanDumper.dump(listProvider);

+        // System.out.println(s);

+        assertEquals("map:\n  foo: 17\n  bar: 19\n", s);

+        // parse

+        JavaBeanLoader<MapProvider> loader = new JavaBeanLoader<MapProvider>(MapProvider.class);

+        MapProvider<String, Integer> listProvider2 = loader.load(s);

+        assertEquals(new Integer(17), listProvider2.getMap().get("foo"));

+        assertEquals(new Integer(19), listProvider2.getMap().get("bar"));

+        assertEquals(listProvider, listProvider2);

+    }

+

+    @SuppressWarnings("unchecked")

+    public void testGenericBean() throws Exception {

+        JavaBeanDumper beanDumper = new JavaBeanDumper();

+        MapProvider<String, Bean> listProvider = new MapProvider<String, Bean>();

+        Bean foo = new Bean();

+        foo.setName("foo");

+        listProvider.getMap().put("foo", foo);

+        Bean bar = new Bean();

+        bar.setName("bar");

+        bar.setNumber(3);

+        listProvider.getMap().put("bar", bar);

+        String s = beanDumper.dump(listProvider);

+        // System.out.println(s);

+        String etalon = Util.getLocalResource("issues/issue61-2.yaml");

+        assertEquals(etalon, s);

+        // parse

+        JavaBeanLoader<MapProvider> loader = new JavaBeanLoader<MapProvider>(MapProvider.class);

+        MapProvider listProvider2 = loader.load(s);

+        Bean foo2 = (Bean) listProvider2.getMap().get("foo");

+        assertEquals("foo", foo2.getName());

+        assertEquals(0, foo2.getNumber());

+        Bean bar2 = (Bean) listProvider2.getMap().get("bar");

+        assertEquals("bar", bar2.getName());

+        assertEquals(3, bar2.getNumber());

+    }

+

+    public static class MapProvider<K, V> {

+        private Map<K, V> map = new HashMap<K, V>();

+

+        public Map<K, V> getMap() {

+            return map;

+        }

+

+        public void setMap(Map<K, V> map) {

+            this.map = map;

+        }

+

+        @SuppressWarnings("unchecked")

+        @Override

+        public boolean equals(Object obj) {

+            if (obj instanceof MapProvider) {

+                return map.equals(((MapProvider) obj).getMap());

+            } else {

+                return false;

+            }

+        }

+

+        @Override

+        public int hashCode() {

+            return map.hashCode();

+        }

+    }

+

+    public static class Bean {

+        private String name;

+        private int number;

+

+        public String getName() {

+            return name;

+        }

+

+        public void setName(String name) {

+            this.name = name;

+        }

+

+        public int getNumber() {

+            return number;

+        }

+

+        public void setNumber(int number) {

+            this.number = number;

+        }

+    }

+}

diff --git a/src/test/resources/issues/issue61-1.yaml b/src/test/resources/issues/issue61-1.yaml
index 52e1f43..80361f2 100644
--- a/src/test/resources/issues/issue61-1.yaml
+++ b/src/test/resources/issues/issue61-1.yaml
@@ -1,7 +1,7 @@
 list:
-- !!org.yaml.snakeyaml.issues.issue61.GenericBeanTest$Bean
+- !!org.yaml.snakeyaml.issues.issue61.GenericListBeanTest$Bean
   name: foo
   number: 0
-- !!org.yaml.snakeyaml.issues.issue61.GenericBeanTest$Bean
+- !!org.yaml.snakeyaml.issues.issue61.GenericListBeanTest$Bean
   name: bar
   number: 3
diff --git a/src/test/resources/issues/issue61-2.yaml b/src/test/resources/issues/issue61-2.yaml
new file mode 100644
index 0000000..2aea65c
--- /dev/null
+++ b/src/test/resources/issues/issue61-2.yaml
@@ -0,0 +1,7 @@
+map:
+  foo: !!org.yaml.snakeyaml.issues.issue61.GenericMapBeanTest$Bean
+    name: foo
+    number: 0
+  bar: !!org.yaml.snakeyaml.issues.issue61.GenericMapBeanTest$Bean
+    name: bar
+    number: 3