2

クライアントコードでジェネリッククラスとその型引数を操作する必要があります。

public class Usable {
    ...
}


public interface User<T extends Usable> {
    public void use(T usable);
}


//client
public class UserDemo { 
    public void demo() {
        Usable usable = getUsable();    //returns Usable
        User<? extends Usable> user = getUser();    //returns User<? extends Usable>

        user.use(usable); //compilation error.
    }

    public Usable getUsable() {
        ....
    }

    public User<? extends Usable> getUser() {
        ....
    }
}

コンパイルエラーは、期待されるタイプはです<? extends Usable>が、渡されるタイプはUsableです。この問題を回避するにはどうすればよいですか?制約は次のとおりです。

  1. クライアントコード( )は、および(サブタイプUserDemoではなく)でのみ機能します。UserUsable
  2. ユーザーは、タイプがのサブタイプであるオブジェクトでのみ作業できますUsable
4

1 に答える 1

3

これは機能しません:

  • user.use(usable);の T を期待します。これはまたは のサブクラスにUser<T extends Usable>することができますUsableUsable
  • usableですUsable
  • getUser()を返します? extends Usable

したがって、次のシナリオを想像できます。

  • getUserSubUsableのサブクラスである を返しますUsable
  • user.use()を期待し、SubUsable渡そうとしている Usable を受け入れることができないことを意味します

の署名をgetUserを返すように変更すると、次のUsableように動作します。

public void demo() {
    Usable usable = getUsable();
    User<Usable> user = getUser();
    user.use(usable);
}

public Usable getUsable() { return null; }

public User<Usable> getUser() { return null; }
于 2013-02-24T11:21:00.683 に答える