草庐IT

Java 泛型不一致的行为?

为什么第一个方法可以编译,而第二个不能?Set和ImmutableSet.Builder的泛型相同,它们的add方法的类型签名也相同。importjava.util.Set;importjava.util.HashSet;importcom.google.common.collect.ImmutableSet;publicclassF{publicstaticImmutableSettestImmutableSetBuilder(){ImmutableSet.Builderbuilder=ImmutableSet.builder();Numbern=Integer.valueOf(4)

java - 泛型方法调用

我有这段代码来自“Java-初学者指南-Schildt”,第13章:packagecom.chapter.thirteen;publicclassGenericMethodDemo{static,VextendsT>booleanarraysEqual(T[]x,V[]y){if(x.length!=y.length)returnfalse;for(inti=0;i编译失败并显示消息-“错误:(39,12)java:类com.chapter.thirteen.GenericMethodDemo中的方法arraysEqual不能应用于给定类型;需要:T[],V[]找到:java.lang

java - 使用泛型和 lambda 重载方法时调用方法不明确

我注意到使用泛型和lambda重载方法时有一种奇怪的行为。这个类工作正常:publicvoidtest(Tt){}publicvoidtest(Suppliert){}publicvoidtest(){test("test");test(()->"test");}没有模棱两可的方法调用。但是,将其更改为此会使第二个调用不明确:publicvoidtest(Classc,Tt){}publicvoidtest(Classc,Suppliert){}publicvoidtest(){test(String.class,"test");test(String.class,()->"test"

Java 泛型——推断嵌套类型

我定义了以下类:classOperationclassGetReservationOperationextendsOperation现在我想要一个这样的类:OperationExecutor>extendsAsyncTask{@OverrideprotectedSdoInBackground(T...params){returnnull;}}但这不会编译:OperationExecutorexecutor=new....为什么Java不允许这样做?一段时间后,我想到了以下解决方案:OperationExecutor,S>extendsAsyncTask{@Overrideprotect

java - 反射性地检查对象是否是方法的有效泛型参数

如何使用反射检查给定对象是否是方法的有效参数(其中参数和对象是泛型类型)?为了获得一些背景知识,这就是我想要实现的目标:在玩反射方法调用时,我认为调用具有特定类型参数的所有方法会很好。这适用于原始类型,因为您可以调用isAssignableFrom(Classc)在他们的类对象上。但是,当您开始将泛型加入混合中时,突然变得不那么容易了,因为泛型不是反射原始设计的一部分,并且是因为类型删除。问题更大,但基本上归结为以下几点:理想的解决方案理想情况下的代码importjava.lang.reflect.*;importjava.util.*;publicclassReflectionAbu

java - JAXB:泛型的多态性

我正在尝试使用JAXB(在Jersey内部)通过泛型实现多态性:@XmlRootElementpublicclassPerformance{@XmlAnyElementprivateListmeasurement;}@XmlJavaTypeAdapter(MeasurementAbstract.Adapter.class)publicinterfaceIMeasurementextendsSerializable{DgetDate();voidsetDate(Ddate);VgetValue();voidsetValue(Vvalue);}@XmlTransient@XmlAccess

java - Guice:如何为所有类型绑定(bind)泛型?

假设我的代码中经常重复以下模式:classA{@InjectpublicA(Listlist){//code}}我要绑定(bind)所有List至ArrayList.我知道我可以使用TypeLiterals绑定(bind)显式原始类型,例如List,但是无论如何都可以对所有类型执行此操作吗?基本上,这段代码应该不会失败,因为我没有显式绑定(bind)List:injector.getInstance(newKey>(){}); 最佳答案 这在Guice中是不可能的。在内部Guice只不过是一个HashMap>,其中一个Key表示可选

java - 从泛型类返回数组

由于在运行代码时将d隐式转换为double,因此在运行此代码时出现ClassCastException错误。但是,如果我将对d的引用更改为Object[],那么它就不能成为set函数的参数。如果我更改set函数以接受Object[]那么一切正常,但是如果有人在不是N.我需要一个可以get()旧数组(或其克隆)并且可以set()数据到新数组的解决方案。publicclassFoo{publicstaticvoidmain(String[]args){Foofoo=newFoo();Double[]d=foo.get();//dostufftod...foo.set(d);}N[]data

java - 静态成员中的泛型参数声明

为什么不允许定义这样的静态成员:privatestaticfinalMap,BiFunction>SPECIFIC_HANDLERS=newHashMap();相反,它只允许在未指定的情况下使用它:privatestaticfinalMap,BiFunction>SPECIFIC_HANDLERS=newHashMap();是否有解决方法,以便我可以定义BiFunction的两个参数必须是同一类型,并且Map的键必须是这些参数的类类型?更新澄清(因为@Mena的建议不适合我):我想要一个映射,用于通用equals助手的数组equals方法。通用助手正式接收两个对象。如果它们是数组,我必

java - Java 中 T(泛型)的实例

简而言之:为什么我不能用Java编写以下代码?publicclassFoo{publicvoidfoo(Objectbar){if(barinstanceofT){//todo}}}是的,我知道,泛型有点黑进了Java。泛型直到Java1.5才出现,泛型类型在运行时丢失。我也知道,它有一些模式。例如:publicclassFoo{Classclazz;publicFoo(Classclazz){this.clazz=clazz;}publicvoidfoo(Objectbar){if(clazz.isInstance(bar)){//todo}}}我的问题是,为什么它不由编译器自动完成