Repository: jdbi/jdbi
Issue: SQL object types with overridden superinterface methods are treated as default

```java
public interface BaseDao<T> {
  void update(T entity);
}

public interface FooDao extends BaseDao<Foo> {
  @Override
  @SqlUpdate("update foo set name = :name where id = :id")
  void update(@BindBean Foo foo);
}
```

At runtime, `Method.isDefault()` actually does return true for `FooDao.update()`, despite it not looking like a default method.

The trick is that this override method is actually a bridge method, which accepts a more specific type (Foo) than the generic parameter on the superclass (T, which is erased to Object), and merely forwards the request to the method with the erased type.

We should update the `isDefault()` check for annotated methods, to let bridge methods through.

Changed files:
sqlobject/src/main/java/org/jdbi/v3/sqlobject/SqlMethodHandlerFactory.java, sqlobject/src/test/java/org/jdbi/v3/sqlobject/TestSqlObject.java

diff --git a/sqlobject/src/main/java/org/jdbi/v3/sqlobject/SqlMethodHandlerFactory.java b/sqlobject/src/main/java/org/jdbi/v3/sqlobject/SqlMethodHandlerFactory.java
index b67aa8a48..7be96298f 100644
--- a/sqlobject/src/main/java/org/jdbi/v3/sqlobject/SqlMethodHandlerFactory.java
+++ b/sqlobject/src/main/java/org/jdbi/v3/sqlobject/SqlMethodHandlerFactory.java
@@ -13,6 +13,8 @@
  */
 package org.jdbi.v3.sqlobject;
 
+import static java.util.stream.Collectors.toList;
+
 import java.lang.annotation.Annotation;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -20,8 +22,6 @@ import java.util.List;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import static java.util.stream.Collectors.toList;
-
 public class SqlMethodHandlerFactory implements HandlerFactory {
     @Override
     public Optional<Handler> buildHandler(Class<?> sqlObjectType, Method method) {
@@ -42,7 +42,7 @@ public class SqlMethodHandlerFactory implements HandlerFactory {
                             sqlMethodAnnotations));
         }
 
-        if (method.isDefault()) {
+        if (method.isDefault() && !method.isSynthetic()) {
             throw new IllegalStateException(String.format(
                     "Default method %s.%s has @%s annotation. " +
                             "SQL object methods may be default, or have a SQL method annotation, but not both.",
diff --git a/sqlobject/src/test/java/org/jdbi/v3/sqlobject/TestSqlObject.java b/sqlobject/src/test/java/org/jdbi/v3/sqlobject/TestSqlObject.java
index f83131681..fb7f1ab1d 100644
--- a/sqlobject/src/test/java/org/jdbi/v3/sqlobject/TestSqlObject.java
+++ b/sqlobject/src/test/java/org/jdbi/v3/sqlobject/TestSqlObject.java
@@ -28,8 +28,10 @@ import org.jdbi.v3.core.Something;
 import org.jdbi.v3.core.mapper.SomethingMapper;
 import org.jdbi.v3.core.rule.H2DatabaseRule;
 import org.jdbi.v3.core.transaction.TransactionException;
+import org.jdbi.v3.sqlobject.config.RegisterBeanMapper;
 import org.jdbi.v3.sqlobject.config.RegisterRowMapper;
 import org.jdbi.v3.sqlobject.customizer.Bind;
+import org.jdbi.v3.sqlobject.customizer.BindBean;
 import org.jdbi.v3.sqlobject.customizer.Define;
 import org.jdbi.v3.sqlobject.customizer.MaxRows;
 import org.jdbi.v3.sqlobject.statement.SqlQuery;
@@ -196,6 +198,13 @@ public class TestSqlObject
         assertThat(dao.update(2, "b")).isFalse();
     }
 
+    @Test
+    public void testSubInterfaceOverridesSuperMethods() {
+        SubclassDao dao = handle.attach(SubclassDao.class);
+        dao.insert(new Something(1, "foo"));
+        assertThat(dao.get(1)).isEqualTo(new Something(1, "foo"));
+    }
+
     @RegisterRowMapper(SomethingMapper.class)
     public interface Dao extends SqlObject
     {
@@ -283,4 +292,20 @@ public class TestSqlObject
             return "foo";
         }
     }
+
+    public interface BaseDao<T> {
+        void insert(T obj);
+        T get(long id);
+    }
+
+    public interface SubclassDao extends BaseDao<Something> {
+        @Override
+        @SqlUpdate("insert into something (id, name) values (:id, :name)")
+        void insert(@BindBean Something something);
+
+        @Override
+        @SqlQuery("select * from something where id = :id")
+        @RegisterBeanMapper(Something.class)
+        Something get(long id);
+    }
 }