Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型-预期返回类型不同于实际返回类型_Java_Generics - Fatal编程技术网

Java泛型-预期返回类型不同于实际返回类型

Java泛型-预期返回类型不同于实际返回类型,java,generics,Java,Generics,下面是我正在编写的一些代码的示例: public interface FooMaker<T extends Enum<T> & FooType> { public List<Foo<T>> getFoos(String bar); } 公共接口FooMaker { 公共列表getFoos(字符串栏); } 让我们进一步假设FooMaker将有许多不同的具体实现。所以我写了一些代码来利用FooMakers FooMaker&l

下面是我正在编写的一些代码的示例:

public interface FooMaker<T extends Enum<T> & FooType>
{
      public List<Foo<T>> getFoos(String bar);
}
公共接口FooMaker { 公共列表getFoos(字符串栏); } 让我们进一步假设FooMaker将有许多不同的具体实现。所以我写了一些代码来利用FooMakers

FooMaker<?> maker = Foos.getRandomMaker();
List<Foo<?>> fooList = maker.getFoos("bar");  //error here!
FooMaker=Foos.getRandomMaker();
List maker=Foos.getRandomMaker();
List-dublist=maker.getFoos(“bar”);
我很难理解为什么作为列表中的参数化类型的Foo声明必须消失以使返回类型正确


有什么想法吗?

因为您将
maker
声明为
FooMaker
。如果您知道特定的
t
AwesomeFooMaker
返回什么,为什么不将其声明为
AwesomeFooMaker
类型?

通常:

class Bar {}
class Baz {}

FooMaker<?> maker = new FooMaker<Bar>();
List<Foo<?>> fooList = maker.getFoos("bar");  //error here!
fooList.add(new Foo<Baz>());                  //cock-up here!
类栏{}
类Baz{}
FooMaker=新FooMaker();
列表请尝试以下方法:

List<? extends Foo<? extends Enum<?>>> fooList = maker.getFoos("bar");
List>>dublist=maker.getFoos(“bar”);
问题是,如果允许这样做:

List<Foo<?>> fooList = maker.getFoos("bar");

list我会稍微编辑一下我的代码。事实上,我不知道我会得到哪一个食品制造商。这并不重要。通过将类型参数声明为
您正在声明“我不知道这将返回什么类型`编译器基本上就像任何与类型参数相关的方法现在是
,即使它是
列表
。你不能使用
foomaker接口的返回类型是List,我的声明是它可以是任何类型的t。即使我声明foomaker,什么不能扩展Enum&FooType?T必须是枚举和扩展FootType,但不能扩展枚举!对于泛型,关键字“extends”用于描述实现的接口。FooType也是一个接口,您仍然可以使用extends关键字。这实际上非常有意义。无效就是一切都被破坏的地方。你的建议和广告上的一样有效。谢谢你的帮助。我选择了另一个人来回答这个问题,因为他提供了一种方法来克服我的局限性,但是我很感谢你的意见,为什么它没有像我预期的那样有效+1.
List<Foo<?>> fooList = maker.getFoos("bar");
Foo<?> foo1 = new Foo<String>();
Foo<?> foo2 = new Foo<Integer>();
fooList.add(foo1);
fooList.add(foo2);