草庐IT

Generics

全部标签

java - 真的需要浅拷贝吗?

我目前正在为Java开发图形库。如您所料,存在一个Vertex类(class)。该类包含类型为VertexData的对象而它本身可以包含任何东西。(我知道这可能是多余的,我可以做Vertex但为了这个问题的目的,这并不重要)。我做了VertexData实现Cloneable并且有一个publicVertexDataclone()通过序列化和反序列化调用返回深拷贝的方法Object,非常像描述的here现在的问题是,既然我有一个深拷贝方法,那么也有一个浅拷贝有意义吗?如果是这样,浅拷贝优于深拷贝的情况是什么?更新:由于大多数答案和评论都以某种方式解释了什么是浅拷贝,我觉得我必须澄清一下。

java - 为什么 Gson 序列化的是列表中的运行时类型,而不是指定的编译时类型?

为什么Gson在序列化的时候好像忽略了嵌套的泛型类型声明?我试图让Gson使用我指定的编译时类型,而不是列表中对象的运行时类型。我也在为A.java使用抽象父类(superclass),但下面的示例存在同样的问题。publicclassA{publicStringfoo;}publicclassBextendsA{publicStringbar;}publicstaticvoidmain(String[]args){Gsongson=newGson();Bb=newB();b.foo="foo";b.bar="bar";Listlist=newArrayList();list.add(

java - 结合可变参数和泛型以在 Java 中进行链式比较

这是一个棘手的问题。我在同时使用可变参数和泛型之间存在冲突。按照给定的代码:publicclassMyObjectimplementsComparable{privateStringname;privateintindex;@OverridepublicintcompareTo(MyObjecto){if(name.compareTo(o.name)!=0)returnname.compareTo(o.name);return((Integer)index).compareTo(o.index);}}我想要compareTo使用多个比较条件的方法。如果字符串相同,则改用整数。我会说通常

java - 有什么办法可以规避 lambda 表达式的类型化?

自从在Java中引入了lambda并受到arelatedquestion的启发,这是我想知道的一个问题,我想我可能会提出来,看看有没有想法。(旁注:有一个similarquestionforC#,但我没有找到用于Java的。关于“将lambda存储在变量中”的Java问题总是指type的变量是固定的——这正是我要规避的)Lambda表达式通过目标类型推断接收它们需要的类型。这一切都由编译器处理。例如,函数staticvoiduseF(Functionf){...}staticvoiduseP(Predicatep){...}都可以用相同的lambda表达式调用:useF(x->true

java - 调用泛型构造函数?

我正在尝试为我的数据库创建自己的存储库以供学习,所以我正在尝试这样的事情:@OverridepublicListgetList(){Cursorcursor=getCursor(somehowGetClassOfT(),null,null);//howtodothis?//excesscoderemoved,restoffunctionnotrelevanttoquestionreturnlist;}protectedCursorgetCursor(Classclazz,Stringselection,String[]selectionArgs){DatabaseObjectdatab

java - 在构造方法引用中,使用泛型类型参数和不使用泛型类型参数的区别?

我正在阅读EffectiveJava3并注意到第43项中的这段代码:“首选对lambda的方法引用”:TreeMap::new注意类型参数。我总是刚刚完成:TreeMap::new我使用Intellij并且从未收到过关于此的警告或任何更改它的建议。事实上,当我让IDE将上述方法引用更改为lambda时,它会将其转换为()->newTreeMap()包含类型参数的值(value)是什么?编译器不能根据变量的类型参数推断出来吗?根据IDE如何将方法引用转换为lambda,它似乎可以。 最佳答案 构造函数引用TreeMap::new与使用

java - 如何在没有未经检查的分配的情况下从通用接口(interface)检索对象列表?

我有以下界面:publicinterfaceUserRepository{ListfindAll(UserCriteriauserCriteria,PageDetailspageDetails);TfindByEmail(Stringemail);}及其实现:@RepositorypublicclassJpaUserRepositoryimplementsUserRepository{publicListfindAll(UserCriteriauserCriteria,PageDetailspageDetails){//implementation}publicJpaUserfindB

Java:类型标记中的通用类型

我有一个类,它接受一个类型标记,然后生成由该类型参数化的类型的对象(好吧,它比那复杂一点,但这是一个简洁的例子):publicclassTest{publicstaticvoidmain(String[]args)throwsException{Holder>i=newObjectHolder(HashSet.class);//thisfails}staticclassHolder{publicHolder(TnewInstance){}}publicstaticHoldernewObjectHolder(ClasstypeToken)throwsException{Construct

java - 具有最终上限的通配符

Class可以正常编译,但是Integer是最终类型,因此将它用作上限没有意义(永远不会extend它)。如果您尝试使用最终类型作为类型参数的上限,您将收到编译器警告:ThetypeparameterTshouldnotbeboundedbythefinaltypeInteger.Finaltypescannotbefurtherextended为什么使用最终类型作为通配符的上限非常好,但对类型参数抛出警告?为什么Java甚至允许通配符受最终上层类型的限制? 最佳答案 Class不像Class那样允许赋值.例如,编译:Classnu

java - 多个通配符边界

假设我有以下类(class):publicclassEither{publicObjectget();}Either是一种存储类型A或B的一个对象的类型。get()检索那个对象。问题是是否可以使用泛型来改变get()的方法签名这样返回的类型就不仅仅是Object,但是A和B的任何公共(public)父类(superclass)型。例如,Either可以有get()返回Number,一个Either,Set>可以有get()返回Iterable或Collection,等等。(显然,Either应该有get()返回Foo)。如果这完全可能的话,如果我有Either,List>,什么是最具体