Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可选,因为参数工作不正常_Java_Optional - Fatal编程技术网

Java 可选,因为参数工作不正常

Java 可选,因为参数工作不正常,java,optional,Java,Optional,我可能弄错了,但是在Java中,我得到了一个可选的作为方法参数的错误 我有一个界面: public interface FooInterface; 以及实现它的类 public class Foo implements FooInterface; 现在,假设我有一个方法接收一个Optional somethod(可选参数) 如果执行此操作,则会出现错误: Optional<Foo> foo = Optional.of(new Foo()); someMethod(foo);

我可能弄错了,但是在Java中,我得到了一个
可选的
作为方法参数的错误

我有一个界面:

public interface FooInterface;
以及实现它的类

public class Foo implements FooInterface;
现在,假设我有一个方法接收一个
Optional

somethod(可选参数)
如果执行此操作,则会出现错误:

Optional<Foo> foo = Optional.of(new Foo());
someMethod(foo);
Optional foo=Optional.of(new foo());
someMethod(foo);
它表示应为
可选
,而不是
可选

为什么呢

  • 使用接口类型
    FooInterface

    final FooInterface foo = new Foo();
    final Optional<FooInterface> optional = Optional.of(foo);
    
    final foo接口foo=new foo();
    最终可选=可选。of(foo);
    

  • 将参数类型更正为
    Optional这与
    Optional
    本身无关,它适用于任何泛型类型

    Java泛型是不变的,这意味着
    Collection
    (或
    Optional
    ,或其他)不是
    Collection
    的子类型,即使
    Foo
    本身是
    FooInterface
    的子类型

    您需要使用通配符使泛型类型协变(正如@Henrik已经指出的):

    /**
    *接受“FooInterface”类型或任何子类型的可选值
    */
    
    someMethod(可选,这是涉及
    扩展/实现的泛型类型的一个普遍缺点

    interface Ifc { }
    class Cls implements Ifc { }
    void somemethod2(List<Ifc> arg) { }
    
    List<Cls> list = new UnlinkedList<>();
    somemethod2(list); // COMPILE ERROR
    
    接口Ifc{}
    类Cls实现Ifc{}
    void somemethod2(列表arg){}
    列表=新的未链接列表();
    somemethod2(列表);//编译错误
    
    在您的情况下,解决方案是:

    somemethod(Optional<FooInterface>.of(foo));
    
    somethod(可选的.of(foo));
    
    或宣布

    void someMethod(Optional<? extends FooInterface> arg) {
    

    void someMethod(OptionalTry
    someMethod)(Optional如果可能,请参见修改Henrik else建议的
    someMethod
    方法签名try
    Optional foo=Optional.of((FooInterface)new foo());
    somemethod(Optional<FooInterface>.of(foo));
    
    void someMethod(Optional<? extends FooInterface> arg) {