我在阅读泛型时遇到了PECS(制片extends
人和消费者的super
简称).
能否给我一个人解释如何使用佩奇之间解决困惑extends
和super
?
我想要一个Class对象,但我想强制它所代表的任何类来扩展A类并实现接口B.
我可以:
Class<? extends ClassA>
Run Code Online (Sandbox Code Playgroud)
要么:
Class<? extends InterfaceB>
Run Code Online (Sandbox Code Playgroud)
但我不能两者兼顾.有没有办法做到这一点?
考虑以下代码:
public class DummyClass {
public List<? extends Number> dummyMethod() {
return new ArrayList<Integer>();
}
}
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨正在尝试存根行为的行dummyMethod()
.关于如何使用有界通配符返回类型的存根方法的任何指针?
我有几个关于Java中通用通配符的问题:
List<? extends T>
和之间有什么区别List<? super T>
?
什么是有界通配符,什么是无界通配符?
我知道Java的泛型类型存在各种反直觉属性.这是我不理解的一个,我希望有人可以向我解释.为类或接口指定类型参数时,可以绑定它以使其必须实现多个接口public class Foo<T extends InterfaceA & InterfaceB>
.但是,如果您要实例化实际对象,则此功能不再起作用.List<? extends InterfaceA>
很好,但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 {
public int getSomething() { return 1; }
public int getSomethingElse() { return 2; }
}
// Notice the multiple bounds here. This works.
static class AandBList<T extends A & B> {
List<T> …
Run Code Online (Sandbox Code Playgroud) 最近,我读了这篇文章:http: //download.oracle.com/javase/tutorial/extra/generics/wildcards.html
我的问题是,而不是创建这样的方法:
public void drawAll(List<? extends Shape> shapes){
for (Shape s: shapes) {
s.draw(this);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以创建一个这样的方法,它工作正常:
public <T extends Shape> void drawAll(List<T> shapes){
for (Shape s: shapes) {
s.draw(this);
}
}
Run Code Online (Sandbox Code Playgroud)
我应该使用哪种方式?在这种情况下,通配符是否有用?
我一直在打击这个问题一段时间,并认为可能会有一些新鲜的眼睛看到这个问题; 谢谢你的时间.
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>());
}
}
Run Code Online (Sandbox Code Playgroud)
使用Java 8.在我看来,直接创建容器test
就等同于容器test2
,但编译器说:
Test.java:15: error: no suitable method found for add(Tbin<Derived>)
test2.add(new Tbin<Derived>());
^
Run Code Online (Sandbox Code Playgroud)
我怎么写Tbin
,TbinList
所以最后一行是可以接受的?
请注意,我实际上将添加类型Tbin
s,这就是我Tbin<Derived>
在最后一行中指定的原因.
什么List<?>
意思,它只是意味着一个未指定类型的对象列表?
谷歌搜索字符串<?>
返回没有任何用处(:
我有关于泛型的Java问题.我宣布了一个通用名单:
List<? extends MyType> listOfMyType;
Run Code Online (Sandbox Code Playgroud)
然后在某些方法中我尝试实例化并将项添加到该列表:
listOfMyType = new ArrayList<MyType>();
listOfMyType.add(myTypeInstance);
Run Code Online (Sandbox Code Playgroud)
哪里myTypeInstance
只是一个类型的对象MyType
; 它不会编译.它说:
该方法在类型List <capture#3-of中添加(捕获#3-of?extends MyType)?extends MyType>不适用于参数(MyType)
任何的想法?
两者之间有区别吗?
<N extends Number> Collection<N> getThatCollection(Class<N> type)
Run Code Online (Sandbox Code Playgroud)
和
Collection<? extends Number> getThatCollection(Class<? extends Number>)
Run Code Online (Sandbox Code Playgroud) bounded-wildcard ×10
generics ×10
java ×10
api ×1
class ×1
list ×1
mockito ×1
pecs ×1
super ×1
unit-testing ×1