Using abstract interpretation to add type checking for interfaces in Java bytecode verification