Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。便利であるため、これを自作してみようと思いました。中で利用しようとすると、下記のようにエラーが出ます。my.test.AppTest.Either<java.lang.Integer,?のキャプチャ#1>質問このコンパイルエラーはなぜ発生するのでしょうか。どのように回避できるでしょうか。票2コンパイルエラーの理由Either<java.lang.Integer,java.lang.String>のStringとEither<java.lang.Integer,?のキャプチャ#1>の?のキャプチャ#1が型として一致しないためコンパイルエラーとなります。Javaでは型引数に「?」を指定した場合、各?の型を表すためのプレースホルダとしてキャプチャが割り当てられます。そのキャプチャがStringとして受け入れ可能かは静的に検証できないためエラーとなります。StringをObjectにしたとしても、やはりプレースホルダーで特定される型の値としてObjectが受け入れ可能なことを静的に検証することはできないためエラーとなります。回避方法その場しのぎの方法ではStringを?にします。手元では動作しましたが、実用的でない感じです。System.out.println(eithers);}型をはっきりさせるため、EitherのofLeft,ofRightで2つの型どちらも指定させます。.collect(Collectors.toList());}これも動作します。キャプチャについては、こちらの解説記事がよいと思います。回https://www.ibm.com/developerworks/jp/java/library/j-jtp04298.htmlScalaであれば、Nothingがあるのでいいですね。Left(i))}OP追記リンク先を読み込んでいった結果、次の理解を得ました。コンパイラにおいては、そのメソッド呼び出し・戻り値は以下のように解決される。