java - 配列 - ジェネリックメソッド



Java総称で複合型構造体を渡すことはできますか? (1)

きれいになるつもりはない。

固定されていない型を使用することができ、id型と比較型をグループ化する型を持つことによって単純化することができます。

public interface Meta<ID, COMP extends Comparable<COMP>> {

}

public interface IdentifiableObject<M extends Meta<?, ?>> {

}

public interface JourneyPattern<M extends Meta<?, ?>>
        extends IdentifiableObject<M> {

}

public interface VehicleJourney<M extends Meta<?, ?>, JP extends JourneyPattern<?>>
        extends IdentifiableObject<M> {

}

型の入れ子になった型を固定するために名前を付ける必要はありません。 具象クラス(あるいはサブインターフェースさえも)を持っていると、とにかくすべての型が固定されます。 例えば:

public class VehicleJourneyImplMeta implements Meta<String, String> {

}

public class VehicleJourneyImpl extends IdentifiableObjectBase<VehicleJourneyImplMeta> 
        implements VehicleJourney<
                VehicleJourneyImplMeta, 
                JourneyPattern<Meta<Integer, String>>> {

}

中間クラス、おそらく匿名クラスを使用して、Metaの型へのアクセスを委任する必要があります。

VehicleJourney<Meta<String, String>, ?> v = something();
Meta<String, String> m = v.getObjectMeta();
String idOfV = m.getId();

メソッドレベルでさまざまな型パラメータを使用すると、おそらくこれを機能させることができます。

あなた(そして私、そしてほとんどの人)が本当に欲しいものは、こんな感じです。

public interface VehicleJourney<M extends Meta<?, ?>, JP extends JourneyPattern<?>>
        extends IdentifiableObject<M> {

        public JP.M.ID getIdOfReferencedX();
}

残念ながら、Javaは戻り型としてJP.M.ID入力をサポートしていません。 多分誰かがこれのためにJSRを上げるでしょう。 私の記憶が正しければ、バイトコードは総称型パラメータの名前を含みます。

私は現在、Javaインターフェースと総称を使用して概念モデル用のAPIを実装しようとしています。 モデル(Transmodel V5.0)は、エンティティリレーションシップモデルとして詳細に説明されていますが、使用されている基本タイプの一部は指定されていません。 たとえば、さまざまなエンティティの識別子の種類や順序を順番に並べるために使用される種類は定義されていません。

私は可能な限り汎用的なAPIを維持したいので、これらの詳細を設定するために総称を使用し始めました。 何かが一貫していると仮定しないことを含めて、私はタイプについていかなる仮定もしたくありません。 各エンティティは異なる識別子タイプを持つことができ、各シーケンスは順序付けの目的で使用される異なるタイプを持つことができます。

私が直面している問題は、あるエンティティが別のエンティティを参照すると複雑さが速くなることです。識別子の型を渡すだけでなく、参照先エンティティを設定するために必要なすべてのものも必要です。

たとえば、私は持っています:

/**
 * @param <ID> The type for the identifier of this entity.
 * @param <ID_JP> The type identifying journey patterns.
 * @param <OP_JP> The ordering used for points in journey patterns.
 * @param <JP> The type of journey pattern referenced by this entity.
 */
public interface VehicleJourney<
        ID,
        ID_JP, OP_JP extends Comparable<OP_JP>, JP extends JourneyPattern<ID_JP, OP_JP>
    > extends IdentifiableObject<ID>
{
    JP getJourneyPattern();
}

私はまだそれを読んでそれを理解することができますが、それは少し冗長以上になっています。 そして、VehicleJourneyのようなエンティティは他のエンティティで参照される可能性があり、それによってタイプパラメータリストが爆発的になります。 これは私が考えることができるほとんど自明ではない例です。

型システムの全体構成をモデル化した単一のJavaエンティティを作成する方法はありますか? 私は、すべての識別子タイプと順序付けタイプを結び付けて、それを1つとして渡すことができるものを考えています。上記の例を次のようにします。

public interface VehicleJourney<CONF, JP extends JourneyPattern<CONF>> 
       extends IdentifiableObject<???>
{
    JP getJourneyPattern();
}

疑問符が付いている箇所では、VehicleJourney IDのタイプを何らかの形でCONFから抽出する必要があります。 それが実現可能であれば、複雑さは管理可能なレベルに留まるべきです。





nested-generics