2007年5月2日水曜日

JavaのGenericsは難しい(修正2)

ちゃんとドキュメントを読んでいないから、型の扱いがいまいちわからん。

class SSS;
class SSS_a extends SSS;
interface EEE;
class TTT;

public interface SC<S extends SSS>;
public abstract class AAA<S extends SSS & EEE, T extends TTT> implements SC<S>;

List<AAA<SSS_a, ?>> aList = new ArrayList<AAA<SSS_a, ?>>();
List<SC<SSS_a>> scList = new ArrayList<SC<SSS_a>>();

void f(List<SC<SSS_a>> v);

f(aList); // ダメ
f(scList); // ok
f((List)aList); // OK


fに渡すのは、SC<SSS_a>のリスト。
AAASC<SはSSSを継承したもの>を実装していて、
ここでは、SSSS_aを指定している。
普通に考えると、このAAA<SSS_a,?>は、SC<SSS_a>として
扱っても問題なさそうなんだけどなー。
まあ、ダメな理由はなんとなくわかるんだけど。Covariantではないから。



0 件のコメント:

コメントを投稿