-1

通常、サブタイプの値が必要な場所にスーパータイプの値を渡すとエラーになります。

編集:例を挙げてください(非常に奇妙なものですが)

interface Testing{
    void printValue(TestClient cl);
}

class TestClient implements Testing{

    private String content;
    public TestClient(String content){
        this.content = content;
    }
    @Override
    public void printValue(TestClient cl) {
        // TODO Auto-generated method stub
        System.out.println((cl.content!=null ?cl.content :"Hello World"));
    }

}

public class Test{
    public static void main(String args[]) {
        Testing t = new TestClient("Hi Friends");
        Testing t1 = new TestClient("Hi Enemies");

        t1.printValue(t);  // generates error (The method printValue(TestClient) in the type Testing is not applicable for the arguments (Testing)
    }
}

ここで、t1.printValue(t)メソッドはエラーを生成しますThe method printValue(TestClient) in the type Testing is not applicable for the arguments (Testing)

ただし、 Generics では、すべてのパラメーター化された型は対応する生の型のサブタイプであるため、生の型が期待される場所にパラメーター化された型の値を渡すことができます。

では、なぜ Java は、パラメーター化された型が期待される場所に未加工の型の値を渡すことを許可するのですか? ただし、未チェックの変換警告を生成することで、この状況にフラグを立てます。

4

2 に答える 2

0

これは下位互換性のためです。printList(List l)次のように呼び出される従来のメソッドを考えてみましょう。

List l = ...

printList(l);

メソッドを に変更しますprintList(List<?> l)。呼び出しで生の型を受け入れることを許可しない場合 (この場合、型チェックが無効になります)、呼び出し元のコードが壊れます。

これは、Java 開発者が直面しなければならなかった状況の 1 つであるため、生の型を渡すことが許可されています。

もう 1 つの理由は、型の消去により、実行時にメソッドの生の型バージョンがまだ存在することです。

于 2013-09-09T13:49:45.603 に答える