diff --git a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java
index 4cb55541ff634c748e58cc9b78bad1022aaf8784..517b103938a1c235376b55d834d53c6f3ade94d8 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java
@@ -155,7 +155,7 @@ public class BEncoder
     out.write(bs);
   }
 
-  public static byte[] bencode(Map<String, Object> m)
+  public static byte[] bencode(Map<?, ?> m)
   {
     try
       {
@@ -169,23 +169,29 @@ public class BEncoder
       }
   }
 
-  public static void bencode(Map<String, Object> m, OutputStream out) throws IOException
+  public static void bencode(Map<?, ?> m, OutputStream out)
+    throws IOException, IllegalArgumentException
   {
     out.write('d');
 
     // Keys must be sorted. XXX - But is this the correct order?
-    Set<String> s = m.keySet();
-    List<String> l = new ArrayList<String>(s);
+    Set<?> s = m.keySet();
+    List<String> l = new ArrayList<String>(s.size());
+    for (Object k : s) {
+      // Keys must be Strings.
+      if (String.class.isAssignableFrom(k.getClass()))
+        l.add((String) k);
+      else
+        throw new IllegalArgumentException("Cannot bencode map: contains non-String key of type " + k.getClass());
+    }
     Collections.sort(l);
 
     Iterator<String> it = l.iterator();
     while(it.hasNext())
       {
-        // Keys must be Strings.
         String key = it.next();
-        Object value = m.get(key);
         bencode(key, out);
-        bencode(value, out);
+        bencode(m.get(key), out);
       }
 
     out.write('e');