2016-12-19 18 views
2

これはthis questionのフォローアップです。私はそれが私が上記やるべきだと思うものを、人間には明らかだと思うクラス内のネストされたテンプレートパラメータのネストされた型を参照する方法は?

public class Foo<ParentType<B> extends Parent<B>, B> { 
//      ^syntax error here: > expected 
    public ParentType<B> parent; 
    public B otherItem; 

    public Foo(ParentType<B> parent, B otherItem) { 
     this.parent = parent; 
     this.otherItem = otherItem; 
     B b = parent.b; 
    } 
} 

、:基本的に、私は以下のクラスがあります。

public class Parent<B> { 

    public B b; 

    public Parent(B b) { 
     this.b = b; 
    } 
} 

public class Child<B> extends Parent<B> { 

    public Child(B b) { 
     super(b); 
    } 
} 

をそして、私はそれらを参照する別のクラスを持っているしたいのですがJavaは基本的に最初のネストされた<で始まる構文的混乱とみなします。

私はクラステンプレート宣言で<B>一部を除去してみてください:

public class Foo<ParentType extends Parent, B> { 
    public ParentType<B> parent; 
//  ^(5:12) 
    public B otherItem; 

    public Foo(ParentType<B> parent, B otherItem) { 
//     ^same error here 
     this.parent = parent; 
     this.otherItem = otherItem; 
     B b = parent.b; 
    } 
} 

が、IntelliJのは

Type 'ParentType' does not have type parameters

を文句を言うと、コンパイラはエラーを与える:私は結局でき

Error:(5, 12) java: unexpected type 
    required: class 
    found: type parameter ParentType 

コードを次のようにすると、すべてのエラーが消えます。

public class Foo<ParentType extends Parent, B> { 
    public ParentType parent; 
    public B otherItem; 

    public Foo(ParentType parent, B otherItem) { 
     this.parent = parent; 
     this.otherItem = otherItem; 
     Object b = parent.b; 
    } 
} 

しかし、これは私がbBある、と私は、私は、例えば、Bを受け取るメソッドに渡すことができるように強制されることを望むことを保証することはできません。

私の以前の質問に対する答えは、テンプレートを追加することでしたが、私はいくつかを削除することによってコンパイルするコードを得ることができました。私は行方不明のトリックですか?

私はこの問題をキャストすることで回避できることを知っていますが、可能であれば、コンパイラによって強制された解決策を用意したいと思います。

答えて

3

その後、あなたが持っているしたいものを達成する必要があり、唯一のパラメータ化クラスに型パラメータを追加します。

public class Foo<ParentType extends Parent<B>, B> { 
    public ParentType parent; 
    public B otherItem; 

    public Foo(final ParentType parent, final B otherItem) { 
     this.parent = parent; 
     this.otherItem = otherItem; 
     final B b = parent.b; 
    } 
} 

は今ParentTypeParent<B>のサブタイプである必要があり、したがって、Bは限りBですParentTypeはそれを無効にしません

+0

これは、後天的にはかなりの意味があります。ほんとうにありがとう! –

関連する問題