2013-08-01 6 views
7

2つの一般的なJavaインタフェース(Foo<T>Bar<T>)があり、その中には多くの実装が存在する可能性があるとします。今、私たちは両方のTに同じ値を使用して、単一のクラス内の各のいずれかを保存することを前提としていますが、正確な実装は入力された保つ:Java:型パラメータ間の相関の確立

public interface FooBar<T, TFoo extends Foo<T>, TBar extends Bar<T>> { 
    TFoo getFoo(); 
    TBar getBar(); 
} 

以上、Tがいることを強制する唯一の目的のために使用されていますTFooTBarのクラスは同じ型パラメータを使用します。 FooBarにこのタイプのパラメータを追加すると、二つの理由冗長ようだ:

  1. FooBar

    は、実際にはおよそT全く気にしません。
  2. TFooTBarから推測できます。

FooBarの型パラメータの一覧を乱雑にすることなく、このような条件を適用する方法がある場合は、私の質問になります。理論的にの代わりにFooBar<String, StringFoo, StringBar>と書いたのは、相当のFooBar<StringFoo, StringBar>です。

+0

私は、 'public interface FooBar 、TBar Bar> {}'をJavaに拡張するのと同じ構文を追加しています。 – Smallhacker

+0

私はこれが可能ではないと思います。 'T'は一般的ではありません。グレート質問+1 –

+0

[冗長一般パラメータ]の可能な複製(http://stackoverflow.com/questions/9684186/redundant-generic-parameters) –

答えて

2

残念ながら、より良い方法はありません...コンパイラは、T型は、それを使用するために宣言する必要があり、それを宣言するために他の場所ではありません。

EDIT:無関係なリンク

If bound A is not specified first, you get a compile-time error:

class D <T extends B & A & C> { /* ... */ } // compile-time error 

(extract from this doc)

これは少し対象外ですが、this docは、タイプパラメータ名の規則を大文字の1文字として定義しています。

+1

私はあなたが作っているポイントに賛成できませんが、私はリンクされた文書がこれに似た何かを扱っていないようだという記録を指摘したいと思います。また、あなたの見積もりは、宣言されているかどうかではなく、境界内のクラスとインターフェイスの順序について話しています。 – Smallhacker

+0

あなたが正しいです、リンクされたドキュメントは、主にテーマに専念しているわけではありませんので、引用符があります(少し鮮明に編集されています)。そして、はい、注文は言及されていますが、「最初に指定されていません」と単に「指定されていません」の違いは何ですか? – gtinon

+0

docが取得しようとしているポイントは、extendsステートメント内のインターフェイスの前にクラスを指定する必要があるということです。文脈から取り除かれたときに見積もりは関連するように見えるかもしれませんが、文脈ではこの話題とは関係ありません。 – Smallhacker

関連する問題