草庐IT

Generics

全部标签

java - 避免 Java 类型删除

有没有一种方法可以避免类型删除并访问类型参数?publicclassFoo&Bar>{publicFoo(){//accessthetemplateclasshere?//i.e.:baz(T.class);//obviouslydoesn'twork}privatevoidbaz(Classqux){//dostufflikeT[]constants=qux.getEnumConstants();...}}我需要了解T,并用它做事。是否可能,如果可以,如何不在构造函数中或参数以外的任何地方传递类?编辑:这个问题的主要目的是找出是否有围绕类型删除的任何实用方法。

java - 具有可变类型参数的泛型

我想做类似的事情publicinterfaceFoo{publicRbar(P...){/*misc*/}}获取要在我的绑定(bind)实现中使用的类型数组。这在Java中可行吗?Varargs旨在让我拥有给定类的任意数量的参数。我想使用它(或类似的东西)让我的方法接受多个参数,每个参数都是给定的不同类的成员。这些类是在泛型绑定(bind)时定义的。我知道有变通办法,但是否有类型安全的方法来做到这一点? 最佳答案 由于您显然希望能够使bar接受多个不同类型的参数(可变参数不用于此),我建议改为采用单个参数。然后,您可以将该单个参数作

java - 是否可以创建其成员仅实现多个接口(interface)的类型安全的 Java 集合?

如果我有:interfaceA{voida();}interfaceB{voidb();}我可以有一个像这样的通用方法:classC{voidc(Tt){t.a();t.b();}}但我不能拥有像这样的通用集合:classD{Listl;}我知道我可以创建一个同时扩展A和B的空接口(interface)E,并有一个包含E的列表...但我宁愿让我的类仅标记为A和B,而不必一个E。当有更多的A和B可以以2^n种方式组合时,这就更成问题了。我宁愿能够动态定义一个类型,作为接口(interface)的联合,并让集合将实现所有接口(interface)的对象识别为该类型的实例。有没有办法在Jav

java - 循环泛型 : interface IFoo <T extends IFoo <T>>

这是Java中一个众所周知的习语。参见例如thisSOdiscussion.所以基本上要定义一个接口(interface),实现它的类需要有一个方法来与它们类的对象进行比较,你会这样做:publicinterfaceIComparable>{publicintcompare(Titem);}(注意:这显然是解决特定用例的一种不必要的复杂方法-请参阅thispost-但我正在询问如何解释递归语法,不要介意特定应用程序)。简而言之,这是一个递归定义,递归没有明显的结束,我看不出编译器/类型系统是如何做到这一点的。此外,尝试用文字表达(“IComparable是一个类,其实例可以与实现ICo

java - 了解 Java 中的 Collections.reverseOrder() 方法

考虑sort的重载定义之一方法来自Array类:publicstaticvoidsort(T[]a,Comparatorc)逆序排列数组的常用方法是传递Comparator由Collections.reverseOrder()返回作为此方法的第二个参数。让我们看看Collections.reverseOrder()的实现来自openjdk7的方法:publicstaticComparatorreverseOrder(){return(Comparator)ReverseComparator.REVERSE_ORDER;}ReverseComparator类:privatestaticc

java - 关于 Java 中通用数组的创建

刚找到一行代码,不太明白。List[]stringLists=newList[1];虽然有警告,但这一行可以在我的AndroidStudioIDE上通过编译。这似乎违反了面向对象语言的基本规则:“父类(superclass)对象可以用子类实例实例化,反之则不行。”String[]ss=newObject[1];//won'tcompile我们知道List是任何泛型List类型的父类(superclass)型,例如List在这种情况下。由于数组是协变的,所以我认为List[]类型是List[]的super类型类型。为什么List[]可以用List[]实例化?

java - 通用符号 <?> 和 < ?扩展对象 > 表现不同

据我了解,和是一样的。但是,当我运行以下代码时未编译并按预期工作,但编译成功。publicclassTest1{interfaceI1{}interfaceI2extendsComparable>{Comparator>A=null;//Comparator>B=A;//expectedcompilationfailComparator>B=A;//compilingsuccessfully.Thisshouldn'tgetcompile}}谁能帮我理解这种行为。 最佳答案 这个问题其实很有趣但是没有问清楚,容易让人觉得是重复的。首

java - 理解 Stream.generate 静态方法签名的问题

Java为什么不选择这个签名StreamStream.generate(Suppliersupplier)在这个StreamStream.generate(Suppliersupplier)?我的意思是下面的例子(不编译)作为String的供应商是正确的s在CharSequence的流中也有效不是吗?SupplierconstantHello=()->"Hello";longcount=Stream.generate(constantHello).count(); 最佳答案 这是一个错误。参见https://bugs.openjdk

java - 如何获取参数化类实例

由于引入了泛型,Class被参数化,因此List.class生成Class。这很清楚。我无法弄清楚的是如何获取自身参数化类型的Class实例,即Class>。就像在这个片段中:publicclassGenTest{staticTinstantiate(Classclazz)throwsException{returnclazz.newInstance();}publicstaticvoidmain(String[]args)throwsException{//Isthereawaytoavoidwaringonthelinebelow//withoutusing@SuppressWar

java - 关于使用 Java 泛型 : "type parameter S is not within its bound" 的错误

我正在使用泛型编写一些类,但找不到解决方案对于SolutionsSubset类,所以我得到了错误“类型参数S不在其范围内”。我看过以前的关于相同错误的问题,但我无法为我的情况解决。有人可以帮助我提高对泛型的了解吗?任何引用一本好书(我可以在google中找到很多信息但如果有人可以推荐一本书、教程等,将受到欢迎)。虽然我试着记住提问的规则,但我如果我的问题不符合这些规则,我深表歉意。我有以下类和接口(interface):publicinterfaceSubset>extendsComparable>publicclassMathSubset>extendsTreeSetimplemen