これは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;
}
}
しかし、これは私がb
がB
ある、と私は、私は、例えば、B
を受け取るメソッドに渡すことができるように強制されることを望むことを保証することはできません。
私の以前の質問に対する答えは、テンプレートを追加することでしたが、私はいくつかを削除することによってコンパイルするコードを得ることができました。私は行方不明のトリックですか?
私はこの問題をキャストすることで回避できることを知っていますが、可能であれば、コンパイラによって強制された解決策を用意したいと思います。
これは、後天的にはかなりの意味があります。ほんとうにありがとう! –