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);