我想这样做:
Foo<String> foo = new Foo<>();
Foo<String>.Bar fooBar = foo.new Bar();
fooBar.doSomething("this works!");
然后在一行中的前两行如下:
Foo<String>.Bar fooBar2 = new Foo<>().new Bar();
fooBar2.doSomething("The above line gives: incompatible types. Required: Foo.Bar Found: Foo.Bar");
但第一行失败了。我明白了:
不兼容的类型。
必需:Foo.Bar
发现:Foo.Bar
为什么?
public class Foo<T> {
public class Bar extends SomeOtherClass<T> {
public void doSomething(T t) {
}
}
}
最后一堂课:
public class SomeOtherClass<T> {
}
答案 0 :(得分:6)
在某些情况下,Java无法很好地处理类型推断(当人们认为应该这样做时)。这是其中一种情况。
如果您明确地将类型传递给new
调用,它将编译:
Foo<String>.Bar fooBar2 = new Foo<String>().new Bar();
答案 1 :(得分:0)
在第一个示例中,您通过将Foo<string>
声明为foo
告诉java您正在使用Foo<string>
:
Foo<String> foo = new Foo<>();
您需要在第二个示例中更好地阐明foo
中模板的类型:
Foo<String>.Bar fooBar2 = (new Foo<String>()).new Bar();