我有一个关于generics的Java问题。 我宣布了一个通用列表: List<? extends MyType> listOfMyType; 然后在一些方法中,我尝试实例化并添加项目到列表中: listOfMyType = new ArrayList<MyType>(); listOfMyType.add(myTypeInstance); myTypeInstance只是MyTypetypes的对象; 它不会编译。 它说: 该方法添加(捕获#3 – ?扩展MyType)typesList <capture#3-of? 扩展MyType>不适用于参数(MyType) 任何想法?
有没有区别 <N extends Number> Collection<N> getThatCollection(Class<N> type) 和 Collection<? extends Number> getThatCollection(Class<? extends Number>)
一直以来我一直在殴打我的头,认为也许有些新鲜的眼睛会看到这个问题; 谢谢你的时间。 import java.util.*; class Tbin<T> extends ArrayList<T> {} class TbinList<T> extends ArrayList<Tbin<T>> {} class Base {} class Derived extends Base {} public class Test { public static void main(String[] args) { ArrayList<Tbin<? extends Base>> test = new ArrayList<>(); test.add(new Tbin<Derived>()); TbinList<? extends Base> test2 = new TbinList<>(); test2.add(new Tbin<Derived>()); } } 使用Java 8.在我看来,像在test直接创build容器相当于test2的容器,但编译器说: Test.java:15: […]
最近,我阅读了这篇文章: http : //download.oracle.com/javase/tutorial/extra/generics/wildcards.html 我的问题是,而不是像这样创build一个方法: public void drawAll(List<? extends Shape> shapes){ for (Shape s: shapes) { s.draw(this); } } 我可以创build一个这样的方法,它工作正常: public <T extends Shape> void drawAll(List<T> shapes){ for (Shape s: shapes) { s.draw(this); } } 我应该使用哪种方式? 在这种情况下通配符是否有用?
考虑这个代码: public class DummyClass { public List<? extends Number> dummyMethod() { return new ArrayList<Integer>(); } } public class DummyClassTest { public void testMockitoWithGenerics() { DummyClass dummyClass = Mockito.mock(DummyClass.class); List<? extends Number> someList = new ArrayList<Integer>(); Mockito.when(dummyClass.dummyMethod()).thenReturn(someList); //Compiler complains about this } } 编译器抱怨试图dummyMethod()的行为。 任何关于如何使用有界通配符返回types的方法的指针?
我知道Java的genericstypes有各种反直觉的属性。 这里有一个特别的,我不明白,我希望有人可以向我解释。 为类或接口指定types参数时,可以将其绑定,以便它必须实现具有public class Foo<T extends InterfaceA & InterfaceB>多个接口。 但是,如果你正在实例化一个实际的对象,这是行不通的。 List<? extends InterfaceA> List<? extends InterfaceA>是好的,但List<? extends InterfaceA & InterfaceB> List<? extends InterfaceA & InterfaceB>无法编译。 考虑以下完整的片段: import java.util.List; public class Test { static interface A { public int getSomething(); } static interface B { public int getSomethingElse(); } static class AandB implements A, B { […]
我想知道这个代码有什么问题: Map <? extends String, ? extends Integer> m = null; Set<Map.Entry<? extends String, ? extends Integer>> s = m.entrySet(); 编译器抱怨错误信息: types不匹配:无法从Set<Map.Entry<capture#1-of ? extends String,capture#2-of ? extends Integer>> Set<Map.Entry<capture#1-of ? extends String,capture#2-of ? extends Integer>> Set<Map.Entry<capture#1-of ? extends String,capture#2-of ? extends Integer>> Set<Map.Entry<? extends String,? extends Integer>> Set<Map.Entry<? extends String,? extends Integer>> 应该是什么types的? Eclipsebuild议Set<?>但是我想要比这更具体。
在Java中我有几个关于通用通配符的问题: List<? extends T>什么区别List<? extends T> List<? extends T>和List<? super T> List<? super T> ? 什么是有界通配符,什么是无界通配符?
我想要一个Class对象,但是我想强制它所代表的任何类来扩展类A并实现接口B. 我可以: Class<? extends ClassA> 要么: Class<? extends InterfaceB> 但我不能这样做。 有没有办法做到这一点?