0

我一直在阅读 Java 中的泛型。在下面教程的通配符部分中,所有示例都用于参数化方法。这让我想到了为什么没有通配符参数化类型声明的示例。 http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

这有意义吗?这是什么意思?

public class MyClass<?>{
    ? myVar;
}
4

2 回答 2

1

使用泛型,您只需:

public class MyClass<T>{
    T myVar;
}

?当您想提供更多上下文时,主要使用该语法 - 即? exteds SomeType

于 2013-12-20T15:30:04.370 回答
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

(有关参数化类型之间“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类型参数也是如此,而通配符(或具体类型)是类型参数

于 2013-12-20T22:27:39.200 回答