2016-06-01 6 views
0

型が抽象クラスにまだ渡されていないときに、(たとえ可能であれば)ベースの戻り値の型を変更しようとしています。抽象スーパークラスが戻り型にスーパータイプを渡す

// 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を得ることができますか?

+0

生の種類は使用しないでください。ワイルドカード ''であなたの 'repo'をパラメータ化してください。下限は 'EnhancedProfile'です。 –

答えて

0

簡単な方法の1つは、ジェネリックを使用しないことです(あなたの例では無意味です)。代わりに、より具体的な方法でメソッドをオーバーライドしてください。

// Base Profile and Repository 
public abstract class BaseProfile { 
} 

public abstract class BaseRepository { 
    public abstract BaseProfile doSomething(String name); 
} 

// Enhanced Profile and Repository 
public abstract class EnhancedProfile extends BaseProfile { 
    public abstract String getName(); 
} 

public abstract class EnhancedRepository extends BaseRepository { 
    @Override 
    public abstract EnhancedProfile doSomething(String name); 
} 

// Instance of Repository 
public class InstanceProfile extends EnhancedProfile { 
    @Override 
    public String getName() { 
     return "Hello World"; 
    } 
} 

public class InstanceRepository extends EnhancedRepository { 
    public EnhancedProfile doSomething(String name) { 
     return null; 
    } 
} 

void whatIWant() { 
    EnhancedRepository repo = new InstanceRepository(); 
    EnhancedProfile enProfile = repo.doSomething(""); 
} 
+0

私の例は、私が構築したはるかに複雑なリポジトリから削除されました。ジェネリックスがなければ私が実際に使っているBaseRepositoryは、開発者が必要とする特定のタイプのプロファイルを構築することはできません。 –

関連する問題