src/share/classes/com/sun/tools/javac/code/Types.java
Print this page
*** 371,381 ****
case TYPEVAR:
return isSubtypeNoCapture(t.getUpperBound(), s);
case BOT:
return
s.tag == BOT || s.tag == CLASS ||
! s.tag == ARRAY || s.tag == TYPEVAR;
case NONE:
return false;
default:
throw new AssertionError("isSubtype " + t.tag);
}
--- 371,382 ----
case TYPEVAR:
return isSubtypeNoCapture(t.getUpperBound(), s);
case BOT:
return
s.tag == BOT || s.tag == CLASS ||
! s.tag == ARRAY || s.tag == TYPEVAR ||
! s.tag == FUNCTION;
case NONE:
return false;
default:
throw new AssertionError("isSubtype " + t.tag);
}
*** 444,453 ****
--- 445,478 ----
&& isSubtypeNoCapture(sup.getEnclosingType(),
s.getEnclosingType());
}
@Override
+ public Boolean visitMethodType(MethodType t, Type s) {
+ if (s.tsym == syms.objectType.tsym || s.tsym == syms.methodHandleType.tsym)
+ return true;
+
+ if (s.tag != FUNCTION)
+ return false;
+
+ //check covariance/contravariance
+ MethodType mType = (MethodType) s;
+ if (!(isSubtypeNoCapture(t.restype, mType.restype)))
+ return false;
+
+ List<Type> lt = t.argtypes;
+ List<Type> lmType = mType.argtypes;
+ while (lt.nonEmpty() && lmType.nonEmpty()) {
+ if (!(isSubtypeNoCapture(lmType.head, lt.head)))
+ return false;
+ lt = lt.tail;
+ lmType = lmType.tail;
+ }
+ return lt.isEmpty() && lmType.isEmpty();
+ }
+
+ @Override
public Boolean visitArrayType(ArrayType t, Type s) {
if (s.tag == ARRAY) {
if (t.elemtype.tag <= lastBaseTag)
return isSameType(t.elemtype, elemtype(s));
else
*** 1095,1104 ****
--- 1120,1142 ----
return isCastable(t.bound, s, warnStack.head);
}
}
@Override
+ public Boolean visitMethodType(MethodType t, Type s) {
+ if (isSubtype(t, s))
+ return true;
+ if (s.tsym == syms.methodHandleType.tsym) {
+ warnStack.head.warnUnchecked();
+ return true;
+ }
+ if (s.tag != METHOD)
+ return false;
+ return isCastable(s, t);
+ }
+
+ @Override
public Boolean visitErrorType(ErrorType t, Type s) {
return true;
}
};
// </editor-fold>
*** 1268,1277 ****
--- 1306,1326 ----
@Override
public Boolean visitTypeVar(TypeVar t, Void ignored) {
return false;
}
+
+ @Override
+ public Boolean visitMethodType(MethodType t, Void ignored) {
+ if (!isReifiable(t.restype))
+ return false;
+ for(List<Type> l = t.argtypes; l.isEmpty(); l = l.tail) {
+ if (!isReifiable(l.head))
+ return false;
+ }
+ return true;
+ }
};
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Array Utils">
public boolean isArray(Type t) {
*** 1583,1592 ****
--- 1632,1648 ----
public Type visitTypeVar(TypeVar t, Boolean recurse) {
return erasure(t.bound, recurse);
}
@Override
+ public Type visitMethodType(MethodType t, Boolean recurse) {
+ if (t.tag == FUNCTION)
+ return syms.methodHandleType;
+ return super.visitMethodType(t, recurse);
+ }
+
+ @Override
public Type visitErrorType(ErrorType t, Boolean recurse) {
return t;
}
};
*** 2007,2017 ****
throw new AssertionError();
}
@Override
public Boolean visitMethodType(MethodType t, Type s) {
! return s.tag == METHOD
&& containsTypeEquivalent(t.argtypes, s.getParameterTypes());
}
@Override
public Boolean visitForAll(ForAll t, Type s) {
--- 2063,2073 ----
throw new AssertionError();
}
@Override
public Boolean visitMethodType(MethodType t, Type s) {
! return (s.tag == METHOD || s.tag == FUNCTION)
&& containsTypeEquivalent(t.argtypes, s.getParameterTypes());
}
@Override
public Boolean visitForAll(ForAll t, Type s) {
*** 2098,2108 ****
if (argtypes == t.argtypes &&
restype == t.restype &&
thrown == t.thrown)
return t;
else
! return new MethodType(argtypes, restype, thrown, t.tsym);
}
@Override
public Type visitTypeVar(TypeVar t, Void ignored) {
for (List<Type> from = this.from, to = this.to;
--- 2154,2164 ----
if (argtypes == t.argtypes &&
restype == t.restype &&
thrown == t.thrown)
return t;
else
! return new MethodType(t.tag, argtypes, restype, thrown, t.tsym);
}
@Override
public Type visitTypeVar(TypeVar t, Void ignored) {
for (List<Type> from = this.from, to = this.to;