前提・実現したいこと
以下のソースコードがコンパイルエラーになる理由が分かりません。どこを直せばコンパイルが通りますか? Java12です。
エラーメッセージ
C:(ディレクトリ名)\example\Eg.java:28:21 java: 不適合な型: example.Eg<java.util.ArrayList<java.lang.String>>をexample.Eg<<anonymous java.util.ArrayList<java.lang.String>>>に変換できません:
Java12
1package example; 2 3import java.util.ArrayList; 4import java.util.function.Function; 5 6class Eg<T> { 7 8 T t; 9 10 Eg(T t){ 11 this.t = t; 12 } 13 14 <R> Eg<R> m1(Function<T,R> fun){ 15 return new Eg<>(fun.apply(t)); 16 } 17 18 void m2(Eg<T> eg){ } 19 20 public static void main(String[] args) { 21 Eg<String> eg = new Eg<>(null); 22 23 eg.m1(str -> new ArrayList<String>(){{ 24 add(str); 25 }}).m2(new Eg<ArrayList<String>>(new ArrayList<>())); 26 } 27}
補足
.m2(...の部分が無ければ通るのですが…
m1 の結果が ArrayList<String> の anonymous subclass になってるので、
eg.m1(str -> (ArrayList<String>) new ArrayList<String>(){{
とすればいいのかも。
素直に型を書けばよろしいのでは?
eg.<ArrayList<String>>m1( ...
hoshi-takanoriさんのおっしゃるとおりだと思います。
FunctionのRがanonymous subclassになっていて、Eg<[anonymous subclass]>みたいになっちゃうので、m2の引数をEg<ArrayList<String>>で呼べないのです。
anonymous subclassの型を残してもいいことないので、インスタンスを作った瞬間にキャストしてあげるのが一番妥当です。
あまり気持ちよくないですが、Functionでキャストしてもいけるようです。
eg.m1((Function<String, ArrayList<String>>)str -> new ArrayList<String>() {{
castが問題ですか?私は<R>の型推論の問題だと思いました。