繁体   English   中英

为什么我的Java通用数组类型传输方法调用无法编译?

[英]Why won't my Java generic array type transfer method call compile?

我正在尝试创建一个系统,使我可以将所有项目放在一个数组中,并使用工厂对象将它们转换为另一种类型的项目,并用这些新对象填充第二个数组,然后将其返回。 我想使用泛型来完成全部操作,因此可以在单行静态方法调用中完成。 但是,我收到了一个我无法完全解析的错误。 这是(我希望)所有相关代码:

问题类具有:

// ...

// "ArrayPP" is my take on ArrayList that has a lot of convenience methods.
// The constructor here uses varargs to initialize the array:
ArrayPP<String> myStrings = new ArrayPP<>("foo", "bar", "baz");
// MyCharSequenceImpl is just a class that implements CharSequence.
ArrayPP<MyCharSequenceImpl> myCSI = new ArrayPP<>();
// The error occurs on the following line:
myCSI = ArrayPP.transfer(myStrings, new CSToMyCSIFactoryDelegate());

// ...

ArrayPP具有:

public class ArrayPP<T> implements Iterable<T> {
    // ...
    // Iterable implementations
    // ...

    public static <From, To> ArrayPP<To> transfer(Iterable<From> origin, FactoryDelegate<From, To> factory)
    {
        ArrayPP<To> ret = new ArrayPP<>();
        for (From f : origin) {
            ret.add(factory.makeFromFactory(f));
        }
        return ret;
    }

    // ...
}

FactoryDelegate具有:

public interface FactoryDelegate<From, To> extends Factory<To> {
    public To makeFromFactory(From basis);
}

Factory有:

public interface Factory<To> {
    public To makeFromFactory();
}

CSToMyCSIFactoryDelegate具有:

public class CSToMyCSIFactoryDelegate implements FactoryDelegate<CharSequence, MyCharSequenceImpl> {
    @Override
    public MyCharSequenceImpl makeFromFactory(CharSequence basis) {
        // MyCharSequenceImpl has a constructor that converts any CharSequence
        // into a new MyCharSequenceImpl.
        return new MyCharSequenceImpl(basis);
    }

    @Override
    public MyCharSequenceImpl makeFromFactory() {
        return makeFromFactory("");
    }
}

这是我得到的错误:

error: method transfer in class ArrayPP<T> cannot be applied to given types;
        myCSI = ArrayPP.transfer(myStrings, new CSToMyCSIFactoryDelegate());
                       ^
  required: Iterable<From>,FactoryDelegate<From,To>
  found: ArrayPP<String>,TransferTest.CSToMyCSIFactoryDelegate
  reason: inferred type does not conform to equality constraint(s)
    inferred: CharSequence
    equality constraints(s): CharSequence,String
  where From,To,T are type-variables:
    From extends Object declared in method <From,To>transfer(Iterable<From>,FactoryDelegate<From,To>)
    To extends Object declared in method <From,To>transfer(Iterable<From>,FactoryDelegate<From,To>)
    T extends Object declared in class ArrayPP

对我来说,此错误最令人困惑的部分是它说inferred type does not conform to equality constraint(s) ,然后推断的类型是CharSequence ,而等式约束是CharSequence,String ...

为什么会出现此错误,如何解决我的代码?

看来您需要的是

public static <From, To> ArrayPP<To> transfer(
    //       vvvvvvvvv
    Iterable<? extends From> origin,
    FactoryDelegate<From, To> factory
)

因为您只关心在迭代origin会产生From ,而不必一定是Iterable<From>

也可以看看

From必须是第一个参数的String ,而必须是第二个参数的CharSequence StringCharSequence的事实与描述它们的泛型无关紧要。 尝试Iterable<? extends From> Iterable<? extends From>可能是?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM