| Index: compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
 | 
| diff --git a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
 | 
| index e8e541346ae429ebf37d89d6edc5a83f4cd17ffb..fd6e898bb8646018147b8d4dd3b8b256b103c144 100644
 | 
| --- a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
 | 
| +++ b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
 | 
| @@ -724,7 +724,10 @@ public class TypeAnalyzer implements DartCompilationPhase {
 | 
|          }
 | 
|        }
 | 
|        if (node.getDefaultClass() != null) {
 | 
| -        validateTypeNode(node.getDefaultClass(), true);
 | 
| +        // TODO(zundel) validate the factory type (and parameters) exactly match the default class,
 | 
| +        // and that the type bounds are assignable to the interface type bounds.
 | 
| +        // For now, we rely on the logic in the Resovler that has paired the
 | 
| +        // typeargs between this interface and the default class.
 | 
|        }
 | 
|        visit(node.getMembers());
 | 
|        checkInterfaceConstructors(element);
 | 
| @@ -771,7 +774,7 @@ public class TypeAnalyzer implements DartCompilationPhase {
 | 
|                  && !interfaceTypes.equals(defaultTypes)) {
 | 
|                onError(
 | 
|                    interfaceConstructor.getNode(),
 | 
| -                  TypeErrorCode.FACTORY_CONSTRUCTOR_TYPES,
 | 
| +                  TypeErrorCode.DEFAULT_CONSTRUCTOR_TYPES,
 | 
|                    Elements.getRawMethodName(interfaceConstructor),
 | 
|                    interfaceClassName,
 | 
|                    Joiner.on(",").join(interfaceTypes),
 | 
| @@ -997,13 +1000,8 @@ public class TypeAnalyzer implements DartCompilationPhase {
 | 
|      @Override
 | 
|      public Type visitMethodDefinition(DartMethodDefinition node) {
 | 
|        MethodElement methodElement = node.getSymbol();
 | 
| -      FunctionType type = methodElement.getFunctionType();
 | 
|        if (methodElement.getModifiers().isFactory()) {
 | 
|          analyzeFactory(node.getName(), (ConstructorElement) methodElement);
 | 
| -      } else {
 | 
| -        if (!type.getTypeVariables().isEmpty()) {
 | 
| -          internalError(node, "generic methods are not supported");
 | 
| -        }
 | 
|        }
 | 
|        return typeAsVoid(node);
 | 
|      }
 | 
| @@ -1022,16 +1020,8 @@ public class TypeAnalyzer implements DartCompilationPhase {
 | 
|            if (!ElementKind.of(e).equals(ElementKind.CLASS)) {
 | 
|              return null;
 | 
|            }
 | 
| -          ClassElement cls = (ClassElement) e;
 | 
| -          InterfaceType type = cls.getType();
 | 
|            List<DartTypeParameter> parameterNodes = node.getTypeParameters();
 | 
| -          List<? extends Type> arguments = type.getArguments();
 | 
| -          if (parameterNodes.size() == 0) {
 | 
| -            return null;
 | 
| -          }
 | 
| -          Analyzer.this.visit(parameterNodes);
 | 
| -          List<TypeVariable> typeVariables = methodElement.getFunctionType().getTypeVariables();
 | 
| -          validateBounds(parameterNodes, arguments, typeVariables, true);
 | 
| +          assert (parameterNodes.size() == 0);
 | 
|            return null;
 | 
|          }
 | 
|        };
 | 
| @@ -1069,14 +1059,19 @@ public class TypeAnalyzer implements DartCompilationPhase {
 | 
|          }
 | 
|          // Check type arguments.
 | 
|          FunctionType ftype = (FunctionType) constructorElement.getType();
 | 
| +
 | 
|          if (ftype != null && TypeKind.of(type).equals(TypeKind.INTERFACE)) {
 | 
|            InterfaceType ifaceType = (InterfaceType) type;
 | 
| -          List<? extends Type> arguments = ifaceType.getArguments();
 | 
| -          ftype = (FunctionType) ftype.subst(arguments, ifaceType.getElement().getTypeParameters());
 | 
| -          List<TypeVariable> typeVariables = ftype.getTypeVariables();
 | 
| -          if (arguments.size() == typeVariables.size()) {
 | 
| -            ftype = (FunctionType) ftype.subst(arguments, typeVariables);
 | 
| +
 | 
| +          List<? extends Type> substParams;
 | 
| +          if (ifaceType.getElement().isInterface()) {
 | 
| +            // Type parameters are specified for the concrete class.
 | 
| +            substParams = ((ClassElement)constructorElement.getEnclosingElement()).getType().getArguments();
 | 
| +          } else {
 | 
| +            substParams = ifaceType.getElement().getTypeParameters();
 | 
|            }
 | 
| +          List<? extends Type> arguments = ifaceType.getArguments();
 | 
| +          ftype = (FunctionType) ftype.subst(arguments, substParams);
 | 
|            checkInvocation(node, node, null, ftype);
 | 
|          }
 | 
|        }
 | 
| 
 |