Tag: generics

创build一个数组来存储Java中的genericstypes

假设我必须创build一个数组来存储整数的ArrayList,数组大小为10。 下面的代码将做到这一点: ArrayList<Integer>[] pl2 = new ArrayList[10]; 问题1: 在我看来,更合适的代码将是 ArrayList<Integer>[] pl2 = new ArrayList<Integer>[10]; 为什么这不起作用? 问题2: 下面两个都编译 ArrayList<Integer>[] pl2 = new ArrayList[10]; ArrayList[] pl3 = new ArrayList[10]; 就pl2和pl3的参考声明而言,有什么区别?

为什么我不能在C#中捕捉到一个通用的exception?

我正在对代码进行一些unit testing,这些代码可能会根据input引发许多exception。 所以我尝试了下面的代码:(例如简化) static void Main(string[] args) { RunTest<ArgumentException>(); } static void RunTest<T>() where T : Exception, new() { try { throw new T(); //throw new ArgumentException(); <– Doesn't work either } catch (T tex) { Console.WriteLine("Caught passed in exception type"); } catch (Exception ex) { Console.WriteLine("Caught general exception"); } Console.Read(); } 但是这总是会打印出“抓住一般exception”, catch(T tex)处理程序将永远不会工作。 […]

如何从genericstypes参数中获取`.class`属性?

这个问题被接受的答案描述了如何在Generic<T>类中创build一个T的实例。 这包括将一个Class<T>parameter passing给Generic构造函数,并从中调用newInstance方法。 然后创build一个新的Generic<Bar>实例,传入Bar.class参数。 如果新Generic类的genericstypes参数不是像Bar这样的已知类,而是genericstypes参数,你该怎么办? 假设我有一些其他的类Skeet<J> ,我想从该类中创build一个新的Generic<J>实例。 然后,如果我尝试在J.class传递,我得到以下编译器错误: cannot select from a type variable. 有没有办法解决? 代码触发错误的具体位是: public class InputField<W extends Component & WidgetInterface> extends InputFieldArray<W> { public InputField(String labelText) { super(new String[] {labelText}, W.class); } /* … */ } public class InputFieldArray<W extends Component & WidgetInterface> extends JPanel { /* … */ public InputFieldArray(String[] labelText, […]

故障排除“types参数T隐藏typesT”警告

在下面的代码中,我在eclipse(最新版本)中得到了一个警告。 public interface A<T> extends B<T> { public T getObject(); } 警告出现在“A”的“T”处,并且显示:“types参数T隐藏typesT”。 奇怪的部分是下面的代码不会产生错误或警告。 public interface A extends B<T> { public T getObject(); } 但是现在我不能一边告诉它T是什么types一边。 我完全困惑。 任何人都知道这是为什么发生? 谢谢。

List <?>是List <Integer>和List <Number>的公共父项吗?

从这个Oracle教程中 , 虽然Integer是Number的子types,但List<Integer>不是List<Number>的子types,实际上这两个types是不相关的。 List<Number>和List<Integer>的公共父级是List<?> 。 我的问题是关于第二句话。 我们怎么能说List<?>是List<Number>和List<Integer>的公共父项? ? 代表未知types,可以是任何参考types。 即使我这样说? 在这里是Object , Object是Integer和Number的公共父项并不意味着List<Object>成为List<Integer>和List<Number>的公共父项。

扩展通用类

public class MyGeneric<T, E> {} public class Extend1<T, E> extends MyGeneric<T, E> {} public class Extend2 extends MyGeneric<String, Object> {} 据我所知,上例中的两个子类都是有效的。 我想知道Java是如何知道什么时候在超类中给出的types将在子类被实例化的时候被定义,以及当它们是实际的类名时(即它如何知道T,E不是类名)? 一个侧面说明,是否允许(即使不常见)使用多个字母的genericstypes? 如果(通过一些严重的计划错误)如果types与现有的类相冲突,例如 public class E{} public class Foo<E>{} 那么会发生什么? 编辑:谢谢你这么及时回答。 为了回答我的第一个问题, Joachim的答案是最有效的。 为了回答这个问题, aioobe的答案更为清晰

用Mockito作为参数来保存Class <T>的方法

有一个通用的方法需要一个类作为参数,我有问题与Mockito存根问题。 该方法如下所示: public <U extends Enum<U> & Error, T extends ServiceResponse<U>> T validate( Object target, Validator validator, Class<T> responseClass, Class<U> errorEnum); 至less对我来说,这太神奇了…我可以想象没有它的生活,但是其他的代码库很高兴地使用它… 我打算在unit testing中存根这个方法返回一个新的空对象。 但是我怎么用mockito来做这个? 我试过了: when(serviceValidatorStub.validate( any(), isA(UserCommentRequestValidator.class), UserCommentResponse.class, UserCommentError.class) ).thenReturn(new UserCommentResponse()); 但由于我混合和匹配匹配器和原始值,我得到“org.mockito.exceptions.misusing.InvalidUseOfMatchersException:无效的参数匹配使用!”

Java通用列表<List <? 扩展Number >>

怎么在java中我们不能这样做: List<List<? extends Number>> aList = new ArrayList<List<Number>>(); 即使这是好的: List<? extends Number> aList = new ArrayList<Number>(); 编译器错误信息是: Type mismatch: cannot convert from ArrayList<List<Number>> to List<List<? extends Number>>

嘲笑一种方法,使用mockito返回带有通配符的generics

我正在使用mockito 1.9.5。 我有以下代码: public class ClassA { public List<? extends MyInterface> getMyInterfaces() { return null; } public static void testMock() { List<MyInterface> interfaces = new ArrayList<>(); ClassA classAMock = mock(ClassA.class); when(classAMock.getMyInterfaces()).thenReturn(interfaces); } 我得到了一个编译错误thenReturn(interfaces)说: "The method thenReturn(List<capture#1-of ? extends MyInterface>) in the type OngoingStubbing<List<capture#1-of ? extends MyInterface>> is not applicable for the arguments (List<MyInterface>)" 但是,当我使用mockito的thenAnswer方法,我不会得到错误。 谁能告诉我发生了什么事? […]

我如何判断一个types是“简单”types? 即拥有一个单一的值

typeof(string).IsPrimitive == false typeof(int).IsPrimitive == true typeof(MyClass).IsClass == true typeof(string).IsClass == true typeof(string).IsByRef == false typeof(MyClass).IsByRef == true // correction: should be false (see comments below) 我有一个实例化T的新实例的方法,如果它是一个“复杂”类,从一组源数据值填充它的属性。 (a)如果T是一个简单的types(例如一个string或者一个int或者其他类似的东西),那么将执行从源数据到T的快速转换。 (b)如果T是一个类(但不是简单的string),那么我将使用Activator.CreateInstance并做一些reflection来填充字段。 有没有一个简单的方法来判断我应该使用方法(a)还是方法(b)? 这个逻辑将在T作为types参数的generics方法中使用。