有时我就是不懂泛型。我经常在代码中使用最通用的集合版本。例如,如果我需要一组任何东西,我会写这样的东西:Setset1=newHashSet();它是编译器允许的,为什么不应该-Set和Set一样一般(或者更通用......)。但是,如果我使用“genericsofgenerics”使其“更通用”是行不通的:Set>singletonSet=newHashSet>();//typemismatch这是怎么回事?为什么是Set可分配给Set和Set>不可分配给Set>?我总能找到解决此类问题的方法,但在这种情况下,我真的很想知道为什么不允许这样做并且不是解决方法。
我试图将一个类的迭代器转换为该类的子类的迭代器。这给了我一个“不可转换类型”的错误。为什么这是不可能的,解决它的最优雅的方法是什么?(或者,如果是的话,为什么这是个坏主意?)在这种情况下,使用for-each循环不是解决方案:我正在尝试实现iterator(),最简单的方法是返回iterator()我类的一个字段,但那个字段没有所需的确切类型。我也无法更改我的iterator()的签名。publicinterfaceSomeoneElsesInterface{publicIteratoriterator();}publicabstractclassMyAbstractClassimpl
我对以下两个方法声明感到困惑:privateTfunWorks(Tchild,Uparent){//Nocompilationerrors}privateTfunNotWorks(Tchild,Uparent){//compilationerrors}难道上面两个都不是有效的吗?类比如果U是T的父级,则T是U的子级。那为什么第二个会报编译错误呢?编辑:我认为,TextendsT和TsuperT都是有效的。对吧? 最佳答案 类型参数(您的示例)只能使用扩展(JLS#4.4):TypeParameter:TypeVariableType
我有一组共享一些共同属性的类,所以我让它们都扩展了一个共同的基类,BaseEntity.所以我有,例如FooextendsBaseEntity和BarextendsBaseEntity.我还想要这些Foo的列表和Bar对象是可排序的,所以我实现了Comparable.我将类定义为FooextendsBaseEntityimplementsComparable和BarextendsBaseEntityimplementsComparable,以及Foo列表的排序s或Bars按预期工作-当然,排序的细节在不同的子类中是不同的。但是当我事先不知道我是否会有Foo时,我不知道如何进行排序。s或
假设我们有这样一个类:publicclassxx{publicinterfaceFoo{TgetValue();voidsetValue(Tvalue);}publicvoidresetFoos(Iterable>foos){for(Foofoo:foos)foo.setValue(foo.getValue());}}它会编译失败,即使直觉上它似乎“应该”:xx.java:10:setValue(capture#496of?)inxx.Foocannotbeappliedto(java.lang.Object)foo.setValue(foo.getValue());原因是foo没有绑
以下代码编译运行成功,没有任何异常importjava.util.ArrayList;classSuperSample{}classSampleextendsSuperSample{@SuppressWarnings("unchecked")publicstaticvoidmain(String[]args){try{ArrayListsList=newArrayList();Objecto=sList;ArrayListssList=(ArrayList)o;ssList.add(newSuperSample());}catch(Exceptione){e.printStackTra
我有1)一个基本的界面,2)几个实现这个接口(interface)的类,3)和一个我想接受的通用类,作为参数,任何实现类我尝试了以下方法:publicclassFooextendsBar{publicFoo(ListsomeInterfaceList){super(someInterfaceList);}...}我收到错误NoWildcardExpected.在我的代码的其他地方,我有诸如List之类的语句而且我没有收到任何错误,那么为什么我会在这里遇到问题?我怎样才能解决这个问题并仍然获得预期的结果?我已尝试搜索“没有预期的通配符”和“类声明中的通配符”,但均无济于事。提前致谢!
如何在Java8中使用泛型参数重载函数?publicclassTest{Listlist=newArrayList();publicintsum(Functionfunction){returnlist.stream().map(function).reduce(Integer::sum).get();}publicdoublesum(Functionfunction){returnlist.stream().map(function).reduce(Double::sum).get();}}Error:java:nameclash:sum(java.util.function.Fun
长话短说:为什么以下在Java中是不可能的?publicclassTest>{}//AandBbothbeinggenericparameters.Note:Idon'thaveanyspecificusecaserightnow,ratherIamjusttryingtounderstandwhythisisnotallowed.起初我以为是因为编译器无法断言A是否可以接受泛型参数,因为在编译A之后,由于类型删除泛型不会再出现了。但是,如果是这样的话,那么我们根本就不能在任何类上使用泛型。所以我拿出一个泛型类的字节码,发现有元数据说它接受泛型。publicclasscom.Test{
我有一个遗留类,该类本身不是泛型,但它的一个方法返回类型使用泛型:publicclassThing{publicCollectiongetStuff(){...}}getStuff()使用泛型返回字符串集合。因此我可以遍历getStuff()并且无需将元素转换为String:Thingt=newThing();for(Strings:t.getStuff())//valid{...}但是,如果我改变Thing本身是通用的,但保持其他一切相同:publicclassThing{publicCollectiongetStuff(){...}}然后继续使用对Thing的非通用引用,getSt