我一直在阅读Java中的泛型。在下面的教程的通配符部分中 所有示例都用于参数化方法。它让我想到为什么没有例子 用于通配符参数化类型声明。 http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
这有意义吗?这是什么意思?
public class MyClass<?>{
? myVar;
}
答案 0 :(得分:1)
使用泛型,你只需:
public class MyClass<T>{
T myVar;
}
主要在您想要提供更多上下文时使用?
语法 - 即? exteds SomeType
答案 1 :(得分:0)
想象B
作为A
的子类,即:
public class A {}
public class B extends A {}
因此,以下代码是合法的:
A a = new A();
A b = new B();
但是,无法强制转换参数化类型,即使是相同的泛型类,即使它们的类型参数处于“是一种”关系,即下面的代码是非法:
MyClass<A> aClass = new MyClass<A>();
MyClass<A> bClass = new MyClass<B>(); //compile error
(有关参数化类型之间“是”关系的更详细说明,请参阅Oracle Generics Tutorial)
所以在这种情况下你应该使用通配符:
MyClass<?> aClass = new MyClass<A>();
MyClass<?> bClass = new MyClass<B>();
MyClass<? extends A> aClass = new MyClass<A>();
MyClass<? extends A> bClass = new MyClass<B>();
如果是非通用对象,则不需要通配符。您始终可以使用Object(或其他上限)并将未知类型的值转换为它。
关于你的例子,它没有意义。 MyClass<?>
是参数化类型,即通过传递类型参数?
创建的具体类型,但它不是泛型类的声明(请参阅generic type invocation )。宣言应该是这样的:
public class MyClass<T> {
T myVar;
}
因此T
是类型参数,而通配符(或具体类型)是类型参数。