Java 7でうまく動作するプログラムがありましたが、Java 8でエラーが発生してコンパイルできませんでした。そのため、Javaの互換性に関する問題が発生し、その理由がわかりましたか?(http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7144506)元のコードスニペットがJava 8で行うことを効率的に複製する方法があるかどうかを知りたいのですが、ここでは状況を表すプログラムがあります。私のコードでは、配列を取り込むという仕事をするセッターメソッドがあり、それがどのように埋め込まれているかを制御することはできません。Java 8の互換性の問題:オブジェクト配列をJava 8のサブタイプリストに変換するにはどうすればよいですか?
import java.util.List;
import java.util.Arrays;
public class HelloWorld{
public static void main(String []args){
B someObject=new B();
List<A> a = someObject.getA() == null ? Collections.EMPTY_LIST : Arrays.asList(someObject.getA());
for (A item : a) {
System.out.println(item.value);
}
}
}
class A{
String value;
public A(String value){
this.value = value;
}
}
class B{
Object[] getA(){
Object arr[]= new Object[4];
arr[0]=new A("hello");
arr[1]=new A("mello");
arr[2]=new A("jello");
arr[3]=new A("cello");
return arr;
}
}
コースビーイングの誤差:
HelloWorld.java:8: error: incompatible types: bad type in conditional expression
List<A> a = someObject.getA() == null ? Collections.EMPTY_LIST : Arrays.asList(someObject.getA());
^
inference variable T has incompatible bounds
equality constraints: A
lower bounds: Object
where T is a type-variable:
T extends Object declared in method <T>asList(T...)
Note: HelloWorld.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
Iは、(できれ一行/エレガント)も同じことを達成するのに効率的である別の方法を必要とします。
編集:明確にする。私はクラスBが私に返すものを制御することはできません。どのような方法でもクラスAを変更することはできません(私はそれがどんな場合にも役立つとは思わない)。私はHelloWorldだけを制御できます。本当に一番簡単なのが、危険なので、ない:@JBNizetが指摘したように
Object[] objArray = someObject.getA(); // omit calling getA() twice
List<A> a = objArray == null ? Collections.emptyList() :
Stream.of(objArray)
.map(o -> (A) o) // or place your transform function in here
.collect(Collectors.toList());
:あなたはBへのアクセス何を持っていませんが、あなたがAさんを取得することが確実な場合
*どのように入力されているのか制御できません*:それはすべてのインスタンスにAのインスタンスが含まれているかどうか分かりません。 Asの代わりにStrings、またはIntegersが含まれていると、何が起こりますか? –
あなたは最初の質問に答えましたが、2番目の質問には答えませんでした。オブジェクトの配列にAの他のインスタンスが含まれている場合、あなたのメソッドは何をしますか? –
@ jb-nizetいいえ私はそれが私がそれを制御することができないだけのインスタンスを含んでいることを確かに知っています。よろしく。 –