Javaでは、2つの整数のリストを取り、2番目のリストに基づいて最初のリストから整数のarrayListを返すメソッドがあるとします。同等のデータ型を識別する
public ArrayList<Integer> func(ArrayList<Integer> A, ArrayList<Integer> B){
ArrayList result = new ArrayList();
//A and B have the same length
for(int index = 0; index < A.length();index++){
//Decide if a gets added to result based on the corresponding B
if(decisionFunction(B.get(i)){
result.add(a.get(i));
}
}
return result;
}
は今、私のような愚かな何かをしたと仮定し
result.add(b.get(i));
に挿入を変更私は関係なく、睡眠不足のことを確実にするために
public ArrayList<AInteger> func(ArrayList<AInteger> A, ArrayList<BInteger> B)
ような何かを行うことができればそれは素晴らしいことですコンパイラはこの種の間違いを防ぐことができます。今、私たちは
class AInteger extends Integer{}; class BInteger extends BInteger{};
を試してみて、残念ながら
func((ArrayList<AInteger>) A, (ArrayList<BInteger>) B);
でメソッドを呼び出すことができ、ダウンキャストは、実行時例外が発生します。だから、この解決法は、AとBを新しいリストに適切なデータ型で再構築することを私に要求しています。これは高価です。さらに注意深く、単体テストを使用することから、コンパイラに2つのリストを区別させるための方法はありますか?
ScalaやHaskellなどの他の言語では、コピーせずに安全に再作成できるものがありますか?あなたの質問は簡単ではありません
Btw。より良いデザインのためには、ArrayListではなくListインターフェイスを使用したいと考えています。また、おそらくList <? BInteger>を拡張します。 –
こんにちは!だから、私は発見した私は、一般的な宣言に使用している場合 公共一覧 FUNC(一覧 A、一覧コンパイラがエラーをキャッチし、これは実行可能なソリューションである、またはオリジナルを行い B これは解決策として除外されていますか? –
archgoon