2012-05-22 8 views
5

は、Java 6では私が使用することができましたJava7では失敗しましたが、Java7でエラーが発生しました(エラーがシンボルを見つけることができません - クラスObjectでfindAll()が検索されるため)コンパイラの変更は7

List<User> users = getCountrySpecificComponent(uk, us).findAll(); 

これは、私は、これはかなり珍しいユースケースであるが、この変化の理由があると知っている

List<User> users = ((Repository)getCountrySpecificComponent(uk, us)).findAll(); 

のJava 7でコンパイル?コンパイラにちょっと "賢い"と言ってもいいでしょうか?

+0

「T」型の目的は何ですか?ジェネリックパラメータを取り除き、 '英国 'と'米国 'が'リポジトリ 'を拡張することができますか?私はそれが問題の根本だと考えています。コンパイラは、あなたが指示しない限り、 'getCountrySpecificComponent()'に渡すものがすべて 'リポジトリ'であることを知ることはできません。 –

+0

良い質問!私はあらゆる種類のレポジトリ、サービス、その他の国固有のものに使用したいと思っています。私はそれをより汎用的/有用にしようとしています。 – skytteren

+0

危険な仮定がなされていない限り、Java 6でもこれがどのようにコンパイルされるのか分かりません...与えられた場合に 'Object'と同じように' T'をリポジトリにするのはなぜですか? – mellamokb

答えて

3

Tは、Repositoryに拡張する必要があります。このようにして、コンパイラはgetCountrySpecificComponentがいくつかのリポジトリを返すことを知っています。

EDIT:

また書き込みしても大丈夫でなければなりません:public static <T extends Repository> T getCountrySpecificComponent(T uk, T us)

0

その後、私はそれを受け入れるために、古いコンパイラの間違いだった同意。この場合

public interface UserFindingComponent{ 
    List<User> findAll(); 
} 

public interface Repository extends UserFindingComponent{ } 

public interface RepositoryUS extends Repository{} 

public interface RepositoryUK extends Repository{} 

...

public static <T extends UserFindingComponent, UK extends T, US extends T> T getCountrySpecificComponent(UK uk, US us) { 
    Country country = CountryContext.getCountry(); 
    if (country == Country.US) { 
     return us; 
    } else if (country == Country.UK) { 
     return uk; 
    } else { 
     throw new IllegalStateException("Unhandled country returned: "+country); 
    } 
} 
0

コンパイラは型パラメータを推測することができませんでした、おそらく同様にJava 6の内ケースとなっているはずである:私はあなたがこのような何かをしたいと思います。コンパイラには、以下の構文を使用してジェネリックタイプを知らせることができます:

import java.util.List; 

class User { 
} 

interface Repository { 
    List<User> findAll(); 
} 

interface RepositoryUS extends Repository { 
} 

interface RepositoryUK extends Repository { 
} 

class Test { 
    public static <T, UK extends T, US extends T> T getCountrySpecificComponent(UK uk, US us) { 
    Country country = CountryContext.getCountry(); 
    if (country == Country.US) { 
     return us; 
    } else if (country == Country.UK) { 
     return uk; 
    } else { 
     throw new IllegalStateException("Unhandled country returned: " + country); 
    } 
    return us; 
    } 

    public static void main(String... args) { 
    RepositoryUK uk = null; 
    RepositoryUS us = null; 
    List<User> users = Test.<Repository, RepositoryUK, RepositoryUS>getCountrySpecificComponent(uk, us).findAll(); 
    } 
} 
関連する問題