草庐IT

Generics

全部标签

java - 这个 Java 泛型范例是做什么的,它叫什么?

我正在查看一些具有以下形式的Java类:publicabstractclassA>implementsComparable{publicfinalintcompareTo(Eother){//etc}}publicclassBextendsA{//etc}publicclassCextendsA{//etc}我在这里使用“Comparable”只是为了说明通用参数“E”的可能用法。这种泛型/继承的用法有名字吗?它有什么用?我的印象是,这允许抽象类提供一个方法(例如compareTo)的通用实现,而不必在子类中提供它。但是,在此示例中,与继承方法不同,它将子类限制为在同一子类的其他实例上

java - 如何获取间接实现的泛型接口(interface)的实际类型参数?

我有一个以多种不同方式实现的参数化接口(interface)。在运行时,我需要弄清楚,给定一个实现该接口(interface)的任意对象,该接口(interface)的实际类型参数是什么。这里有一个片段来说明这个问题,并尝试解决它(alsoonideone.com):importjava.util.*;importjava.lang.reflect.*;interfaceAwesome{}classBaseimplementsAwesome>{}classChildextendsBase>{}classAwesomeExample{publicstaticvoidmain(String

java - 一种将参数传递给方法的奇怪方式

我正在浏览ExchangeWebServicesJavaAPI代码并看到了开发人员将参数传递给他们的方法的设计选择。能否帮助解释该技术的好处--方法要处理的类型在传递给方法之前由通用包装类包装,例如,如果方法要处理字符串,则将newParam()传递给Param所在的方法定义如下classParam{privateTparam;publicTgetParam(){returnparam;}publicvoidsetParam(Tparam){this.param=param}}这是来自源代码的片段——该方法适用于HttpWebRequest对象。调用者创建Param的实例,即受Http

多级泛型中的 Java 通配符

为什么Bar.go使用参数f2而不是参数f1OK?publicclassHelloWorld{publicstaticvoidmain(String[]args){Foo>f1=newFoo>();Foo>f2=newFoo>();Bar.go(f1);//notOKBar.go(f2);//OK}publicstaticvoidp(Objecto){System.out.println(o);}}classFoo{}classBar{publicstaticvoidgo(Foo>f){}}在这两种情况下,编译器不应该自动将类型T推断为captureof?吗?

java - 泛型通配符实例化

前几天我在审查别人的代码时,遇到了引起一些关注的一行。为简化起见,假设我有一个通用类A和一个抽象类B。是否允许以下​​实例化?如果允许,为什么?Objectobj=newA();我个人从来没有见过像上面这样的实例化,尽管像这样的声明Aobj=null;肯定会持有。我一直在泛型中使用通配符来声明方法参数,所以我可能没有经验。 最佳答案 实际上newA()不编译。自Java5以来,它一直是非法的。但我猜你的原始示例类似于newA>().后者在最新版本的Java中是合法的。这个想法是,当实例化一个对象时,类型参数的值可以是任何非通配符类型

java - 如何确保仅协变地使用类型参数?

假设我有一个通用接口(interface)Source这是T的纯生产商对象。作为一个纯粹的生产者是接口(interface)契约的一部分。所以itisareasonableexpectation无论你能用Source做什么,如果你有Source也应该可以做到.现在我需要在Source的正文中强制执行此限制,这样就不会有人不小心使用了T以一种与该契约(Contract)相矛盾的方式。来自JDK的示例正如@Miserable.Variable指出的那样,ArrayList和ArrayList不等价。那是因为ArrayList作为通用类型不是协变的。或者换句话说,ArrayList不是T的纯

java - 通用构造函数 (Class<T> clazz) 不支持 T,其中 T 是另一个泛型

想象一下这个类:publicclassObjectCreator{privateClasspersistentClass;publicObjectCreator(ClasspersistentClass){this.persistentClass=persistentClass;}publicTcreate(){Tinstance=null;try{instance=persistentClass.newInstance();}catch(Exceptione){e.printStackTrace();}returninstance;}}现在我用领域对象对它进行子类化:publiccl

java - 泛型泛型 : "Syntax error on token "extends",,预期”

publicinterfaceView{...publicinterfaceControl{...publicclassRemoteControl>implementsControl{...在RemoteControl类的“VextendsView”上给我一个“token'extends',expected”的“语法错误”。我想下面的选择是可能的publicclassRemoteControl,VextendsView>implementsControl{...我仍然想知道这是否不能以更隐式的方式完成,因为后者需要对View进行冗余声明。即:publicclassTVRemoteCon

java - 对于类型T的方法,它的 'inferred'类型应该是什么当它需要两个<? super T> 争论?

hamcrest库中有一个方法:packageorg.hamcrest.core...publicstaticMatcherallOf(Matcherfirst,Matchersecond){List>matchers=newArrayList>(2);matchers.add(first);matchers.add(second);returnallOf(matchers);}在我的代码中,我用first调用这个方法正在Matcher和second正在Matcher.现在:当我用带有1.6目标的Eclipse编译它时,它生成Matcher.当我用带有1.6目标的javac1.7编译它

另一个泛型的 Java 泛型

我有界面:interfaceIdentifable{TgetID();}和实现它的类:publicclassCatimplementsIdentifable{publicLonggetID(){...};}一切正常。迄今为止。现在我想创建GenericDAO,为什么我不能创建它?:publicabstractGenericDAO>{TgetByID(Sid);}我只能这样声明我的GenericDAO:publicabstractGenericDAO{TgetById(Sid);}并完成类(class):publicCatDAOextendsGenericDAO{CatgetById(L