必需类型与找到的类型相同

时间:2015-06-04 21:39:18

标签: java types

我想这样做:

    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> {
}

2 个答案:

答案 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();