?
作为类型参数只能在方法中使用。例如:printAll(MyList<? extends Serializable>)
我无法定义类?
作为类型参数。
通配符 (?
) 不是正式的类型参数,而是可以用作类型参数。在你给出的例子中,? extends Serializable
作为泛型类型的类型参数给出MyList
, 的printAll
方法的参数。
Methods 还可以声明类型参数 http://docs.oracle.com/javase/tutorial/extra/generics/methods.html像类,例如:
static <T extends Serializable> void printAll(MyList<T> myList)
我了解上限?
. printAll(MyList<? extends Serializable>)
means 如果 MyList 具有实现 Serialzable 接口的对象,则 printAll 将打印 MyList
更准确地说,它的意思是打电话给printAll
仅当传递 a 时才会编译MyList
具有某种泛型类型或实现Serializable
。在这种情况下,它将接受MyList<Serializable>
, MyList<Integer>
, etc.
我有一点问题super
. printAll(MyList<? super MyClass>)
means 如果 MyList 具有 MyClass 或任何扩展 MyClass 的类的对象,则 printAll 将打印 MyList(MyClass 的后代)
通配符的边界为super
is a lower边界。所以我们可以说打电话给printAll
仅当传递 a 时才会编译MyList
一些泛型类型是MyClass
或某些超类型MyClass
。所以在这种情况下它会接受MyList<MyClass>
, e.g. MyList<MyParentClass>
, or MyList<Object>
.
所以,假设 MyClass 看起来像:
public class MyClass extends Thread implements ActionListener{
// whatever
}
那么 printAll() 将打印如果
- 列表中有MyClass的对象
- 列表中有Thread或ActionListener的对象
你走在正确的轨道上。但我想说例如“如果有物体,它将打印MyClass
在列表中”是有问题的。这听起来像是您正在定义运行时行为 - 泛型都是关于编译时检查的。例如,无法通过MyList<MySubclass>
作为论据MyList<? super MyClass>
,即使它可能包含实例MyClass
,通过继承。我将其改写为:
致电printAll(MyList<? super MyClass>)
仅当传递以下参数时才会编译:
MyList<MyClass>
MyList<Thread>
MyList<Runnable>
MyList<ActionListener>
MyList<EventListener>
MyList<Object>
-
MyList<? super X>
where X
is MyClass
, Thread
, Runnable
, ActionListener
, EventListener
, or Object
.
所以,在阅读了这个问题的许多答案之后,这是我的
理解:
? extends T
means 任何扩展 T 的类。因此,我们指的是
T 的孩子。因此,T 是上限。最上层阶级
在继承层次结构中
? super T
表示任何类/接口super
T.因此我们是
指的是T的所有父母。因此 T 是下界。这
继承层次结构中最底层的类
接近,但我不会说“孩子们T
”或“父母T
“,因为这些界限是包括的- 更准确的说法是“T
或其子类型”和“T
或其超类型”。