Java 可选,因为参数工作不正常
我可能弄错了,但是在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);
可选的作为方法参数的错误
我有一个界面:
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(OptionalTrysomeMethod)(Optional如果可能,请参见修改Henrik else建议的someMethod
方法签名tryOptional foo=Optional.of((FooInterface)new foo());
somemethod(Optional<FooInterface>.of(foo));
void someMethod(Optional<? extends FooInterface> arg) {