3

次のコードが機能しない理由を誰かに説明してもらえますか?

public class TestGeneric {

    EntityManager entityManager = new EntityManager();

    public <T extends Textable & Entity> void doAction(T obj) {
        entityManager.getAliasForEntityClass(obj.getClass());
    }
}

class EntityManager {

    public String getAliasForEntityClass(Class<? extends Entity> clazz) {
        return clazz.getCanonicalName();
    }
}

interface Entity {
    Long getId();
}

interface Textable {
    String getText();
}

次のエラーが表示されます。

The method getAliasForEntityClass(Class<? extends Entity>) in the type EntityManager is not applicable for the arguments 
 (Class<capture#1-of ? extends Textable>)

このように書いた場合、エラーはありませんでした:

public class TestGeneric {

    EntityManager entityManager = new EntityManager();

    public <T extends Entity & Textable> void doAction(T obj) {
        entityManager.getAliasForEntityClass(obj.getClass());
    }
}

class EntityManager {

    public String getAliasForEntityClass(Class<? extends Entity> clazz) {
        return clazz.getCanonicalName();
    }
}

interface Entity {
    Long getId();
}

interface Textable {
    String getText();
}

テンプレート<T extends Entity & Textable><T extends Textable & Entity>手段: T は Entity および Textable インターフェイスを実装する必要があります。この例でインターフェイスの位置が重要なのはなぜですか?

4

1 に答える 1

2

その理由は、 の消去がT境界の左端の型だからです。getClass()ドキュメントから:

実際の結果の型はClass<? extends |X|>、が呼び出さ|X|れた式の静的型の消去です。getClass

JLS は、「型変数の消去はその左端の境界の消去である」と規定しています (こちらを参照)。したがって、 のタイプはobj.getClass()最初Class<? extends Textable>のケースとClass<? extends Entity>他のケースにあります。

于 2012-07-11T01:00:43.757 に答える