我一直在阅读 Java 中的泛型。在下面教程的通配符部分中,所有示例都用于参数化方法。这让我想到了为什么没有通配符参数化类型声明的示例。 http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
这有意义吗?这是什么意思?
public class MyClass<?>{
? myVar;
}
我一直在阅读 Java 中的泛型。在下面教程的通配符部分中,所有示例都用于参数化方法。这让我想到了为什么没有通配符参数化类型声明的示例。 http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
这有意义吗?这是什么意思?
public class MyClass<?>{
? myVar;
}
使用泛型,您只需:
public class MyClass<T>{
T myVar;
}
?
当您想提供更多上下文时,主要使用该语法 - 即? exteds SomeType
想象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
(有关参数化类型之间“is a”关系的更详细说明,请参阅Oracle 泛型教程)
所以在这种情况下你应该使用通配符:
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<?>
是参数化类型,即是通过传递类型参数创建的具体类型?
,但它不是泛型类的声明(请参阅泛型类型调用)。声明应该是这样的:
public class MyClass<T> {
T myVar;
}
T
类型参数也是如此,而通配符(或具体类型)是类型参数。