提交 0f98c281 编写于 作者: A Andrey Breslav

KT-1781 Can't distinguish between two constructors

 #KT-1781 Fixed

 Now, if foo() and foo(vararg bar) both match the call site, the first one is preferred
上级 d549e9d3
......@@ -94,10 +94,24 @@ public class OverloadingConflictResolver {
List<ValueParameterDescriptor> gParams = g.getValueParameters();
int fSize = fParams.size();
if (fSize != gParams.size()) return false;
for (int i = 0; i < fSize; i++) {
int gSize = gParams.size();
if (fSize > gSize) return false;
for (int i = 0; i < gSize; i++) {
ValueParameterDescriptor gParam = gParams.get(i);
JetType gParamType = gParam.getType();
if (i >= fSize) {
// f() has fewer parameters than g()
// The point is: g() may have a last vararg that doesn't get any arguments
// In this case f() is more specific, because one can explicitly pass
// an empty array to g() and make it preferred
if (i != gSize - 1 || gParam.getVarargElementType() == null) {
return false;
}
return true;
}
JetType fParamType = fParams.get(i).getType();
JetType gParamType = gParams.get(i).getType();
if (!typeMoreSpecific(fParamType, gParamType)) {
return false;
......
fun foo(vararg <!UNUSED_PARAMETER!>t<!> : String) = ""
fun foo(vararg <!UNUSED_PARAMETER!>t<!> : Int) = ""
fun test() {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo()<!>
}
\ No newline at end of file
fun foo0() : String = "noarg"
fun foo0(vararg <!UNUSED_PARAMETER!>t<!> : Int) : String = "vararg"
fun test0() {
foo0()
foo0(1)
val a = IntArray(0)
foo0(*a)
}
\ No newline at end of file
fun foo1(<!UNUSED_PARAMETER!>a<!> : Int) : String = "noarg"
fun foo1(<!UNUSED_PARAMETER!>a<!> : Int, vararg <!UNUSED_PARAMETER!>t<!> : Int) : String = "vararg"
fun test1() {
foo1(1)
val a = IntArray(0)
foo1(1, *a)
}
\ No newline at end of file
// FILE: kotlin.kt
fun foo() {
JavaClass()
JavaClass("")
}
// FILE: JavaClass.java
public class JavaClass {
public JavaClass() { }
public JavaClass(String... ss) { }
}
~nilary~fun foo0() : String = "noarg"
~vararg~fun foo0(vararg t : Int) : String = "vararg"
fun test0() {
`nilary`foo0()
`vararg`foo0(1)
val a = intArray()
`vararg`foo0(*a)
}
~unary~fun foo1(a : Int) : String = "noarg"
~vararg~fun foo1(a : Int, vararg t : Int) : String = "vararg"
fun test1() {
`unary`foo1(1)
`vararg`foo1(1, 1)
val a = intArray()
`vararg`foo1(1, *a)
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册