型が抽象クラスにまだ渡されていないときに、(たとえ可能であれば)ベースの戻り値の型を変更しようとしています。抽象スーパークラスが戻り型にスーパータイプを渡す
// Base Profile and Repository
public abstract class BaseProfile { }
public abstract class BaseRepository<T extends BaseProfile> {
public abstract T doSomething(String name);
}
// Enhanced Profile and Repository
public abstract class EnhancedProfile extends BaseProfile {
public abstract String getName();
}
public abstract class EnhancedRepository<T extends EnhancedProfile> extends BaseRepository<T> {
}
// Instance of Repository
public class InstanceProfile extends EnhancedProfile {
@Override
public String getName() { return "Hello World"; }
}
public class InstanceRepository extends EnhancedRepository<EnhancedProfile> {
public EnhancedProfile doSomething() { return null; }
}
は今、私が欲しいのは、それがクラスを継承してアクセスすることができます知らずにEnhancedRepositoryを格納することです(私はそのような当たり障りのない説明のために申し訳ありませんが、私は本当に良くこれを説明する方法を見当もつかない) EnhancedProfile、BaseProfileは、以下を参照してくださいません:
// What I want
EnhancedRepository repo = new InstanceRepository();
EnhancedProfile enProfile = repo.doSomething();
// Does not work because the doSomething() method actually returns
// BaseProfile, when I need it to at least return the EnhancedProfile
// What I know works, but can't do
EnhancedRepository<InstanceProfile> repo2 = new InstanceRepository();
EnhancedProfile enProfile2 = repo2.doSomething();
// This works because I pass the supertype, but I can't do this because I need
// to be able to access EnhancedProfile from the doSomething() method
// from a location in my project which has no access to InstanceProfile
にはどうすればEnhancedRepositoryのスーパータイプを知らなくても、代わりにベース-最も入力BaseProfileの、doSomethingの()からEnhancedProfileを得ることができますか?
生の種類は使用しないでください。ワイルドカード '>'であなたの 'repo'をパラメータ化してください。下限は 'EnhancedProfile'です。 –