Tag: generics

API java 5及更多:我应该返回一个数组还是一个Collection?

本着最佳实践的精神:总是返回一个____,从不____ ,我在即将从JDK1.4.2迁移到JDK5以及更多时遇到类似的问题。 (是的,我知道 , JDK1.4.2是EOL! ;-))。 对于返回集合的函数(不是简单的属性集合 ),我总是更喜欢(在JDK1.4.2中)返回一个Array而不是一个通用的List,因为: 它强制执行返回类型( MyObject[]而不是对象列表,在静态上更加类型安全 – 如’编译’ – 级别) 它为返回的集合建议一个“只读”字符(将一个元素添加到集合中会更复杂,即使这不像c#中的’只读’关键字那样严格)。 这与说“不可变”不同,因为数组中的引用仍然可以修改… 当然,我总是创建这个返回的数组(我没有公开任何’内部’数组) 现在,在JDK5及更多版本中,如果需要,我可以使用List 。 在java5中编码时选择返回MyObject[]而不是List或Collection什么好理由? 奖金,如果使用Collection ,是否可以: 对返回的集合强制执行只读属性? (没有add()或remove()可能) 对返回的集合强制执行不可变的方面? (甚至不能修改该集合的引用) PS: JavaGenericFAQ没有那个。

Javagenerics通配符问题

在使用Google Guava优秀的Multimap时,我遇到了Generics的一些问题。 我有一个类型Handler定义为这样 public interface Handler { void handle(T t); } 在另一个类中,我定义了一个将String映射到Handlers集合的多图。 private Multimap<String, Handler> multimap = ArrayListMultimap.create(); 现在,当我尝试使用multimap时,我遇到了编译器错误。 我的第一次尝试看起来像这样: public void doStuff1(String s, T t) { Collection<Handler> collection = multimap.get(s); for (Handler handler : collection) { handler.handle(t); } } 这导致以下错误。 Type mismatch: cannot convert from Collection<Handler> to Collection<Handler> 之后,我试着像这样编码 public void doStuff2(String s, Serializable […]

Mockito和Hamcrest:如何validationCollection参数的调用?

我遇到了Mockito和Hamcrest的仿制问题。 请假设以下界面: public interface Service { void perform(Collection elements); } 以下测试片段: Service service = mock(Service.class); // … perform business logic verify(service).perform(Matchers.argThat(contains(“a”, “b”))); 所以我想validation我的业务逻辑实际上是用这个顺序包含“a”和“b”的集合调用服务。 但是, contains(…)的返回类型是Matcher<Iterable> Matcher<Iterable> ,所以Matchers.argThat(…)在我的情况下返回Iterable ,这自然不适用于所需的Collection 。 我知道我可以使用Hamcrest hasItem和Mockito中提出的参数捕获器validation不一致 ,但我非常愿意不这样做。 有什么建议! 谢谢!

如果使用旧库,如何避免Java中的unchecked-conversion-warning?

我喜欢java中的genericsfunction并经常使用它。 但是我有一个问题,如果我使用的是尚未了解generics的库。 一个例子是servlet。 如果使用ServletRequest.getParameterMap() ,结果将是原始映射,但它仅包含String作为键, String[]作为值。 所以我想将它分配给Map 。 但是对于这项任务我得到了警告。 如何使用该语言避免此警告,而不是通过使用@SuppressWarnings注释来抑制警告。

如何在Javagenerics方法中正确返回generics数组?

我有以下generics方法返回一个通用数组: public static T[] genericMethod1(List input) { T[] res = (T[]) new Object[input.size()]; int i = 0; for (T t : input) { res[i] = t; i++; } return res; } public static T genericMethod2(List input) { return input.get(0); } 但后来当我尝试使用以下结果获取结果数组时: LinkedList list = new LinkedList(); list.addFirst(1); list.addFirst(1); Integer[] i = (Integer[]) genericMethod1(list); // 1) […]

在java中,可以创建一个流畅的可扩展类层次结构,其中的方法可以按任何顺序调用吗?

可以在java中创建一个可扩展的类层次结构,其方法流畅且可以按任何顺序调用吗? (是的!请参阅下面的答案),即使对于现有的课程,如果您无法访问源代码,只要方法是流畅的! 我正在改造现有的层次结构,并希望使用工厂或至少一个通用的构造函数和(最终)不可变的构建器模式(JB P.14)。 设置字段的方法返回void – 它们更好地返回一个通用T – 这样我们就可以获得进行方法链接的能力(它们现在都调用super )。 目标: 1. 避免在每个类中创建静态getFactory()方法。 2. 简单的方法签名。 3. 创建一个通用的工厂方法,但会在编译时捕获问题。 4. 在出错时获取编译时错误而不是运行时错误。 根据要求,非通用代码非常简单,但不起作用。 public class A { private String a = null; protected A setA(String a){ this.a = a; return this;//<== DESIRE THIS TO BE CHAINABLE } protected static A factory(){ return new A(); } } 。 public […]

使用通配符将Javagenerics编译为C ++模板

我正在尝试构建Java到C ++的转换器(即Java代码进入,语义上“等效”(或多或少)C ++代码出来)。 不考虑垃圾收集,这些语言非常熟悉,因此整个过程已经很好用了。 然而,一个问题是C ++中不存在的generics。 当然,最简单的方法是执行java编译器所做的擦除。 但是,生成的C ++代码应该很好处理,所以如果我不丢失generics类型信息会很好,即如果C ++代码仍然可以使用List而不是List ,那将会很好。 否则,C ++代码需要在使用此类generics的任何地方进行显式转换。 这很容易出错并且不方便。 所以,我试图找到一种方法来以某种方式获得更好的generics表示。 当然,模板似乎是一个很好的候选人。 虽然它们是完全不同的(元编程与仅编译时类型增强),但它们仍然有用。 只要不使用通配符,只需将通用类编译为模板即可。 然而,只要通配符发挥作用,事情就会变得非常混乱。 例如,考虑以下列表的java构造函数: class List{ List(Collection c){ this.addAll(c); } } //Usage Collection c = …; List l = new List(c); 怎么编译呢? 我有想法在模板之间使用电锯重新解释。 然后,上面的例子可以这样编译: template class List{ List(Collection c){ this.addAll(c); } } //Usage Collection c = …; List l […]

Javagenerics中类型参数的前向引用

根据Java Generics FAQ http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#FAQ302 ,类型参数不能以这种方式前向引用 // error 但是没关系 <A extends List, B> // ok 这两个示例使用最新的jdk 1.6.0_24进行validation。 我的问题是,在语言规范中,这是指定的,隐含的还是可扣除的(即如果它是不真实的,其他事情可能会爆炸)。 我找不到任何地方。 更新 在javac7中,它是允许的。 直观地说,类型参数的顺序无关紧要; 类型系统要求类型变量之间没有循环依赖: 。 以前,这可以通过禁止前向参考来保证。 显然javac 7经过改进以放松排序,同时无论排序如何都能检测循环。

关于ArrayList x的Java问题

我一直有这个问题与ArrayLists数组。 也许你可以帮忙。 //declare in class private ArrayList[] x; //in constructor x=new ArrayList[n]; 这会生成有关未经检查的转换的警告。 但 x=new ArrayList[n]; 是一个编译器错误。 任何想法? 谢谢!

将Java 8 Lambdas与generics一起使用

是否可以使用Predicate接口执行此操作。 我有一个客户端类,它使用MathUtility类提供的函数。 无论Mathmatical操作是什么,它都应该只在MathUtility类中发生。 //in client MathUtility.sum(listOfInts, (Integer i)->{return (i<3);}); //in utility class MathUtility { public static T sumWithCondition(List numbers, Predicate condition) { return numbers.parallelStream() .filter(condition) .map(i -> i) .reduce(0, T::sum); //compile time error } public static T avgWithCondition(List numbers, Predicate condition) { //another function } //lot many functions go here } 现在它失败并出现此错误 – The method […]