Java中的通配符参数化类型

时间:2013-12-20 12:03:33

标签: java generics wildcard parameterized-class

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

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

public class MyClass<?>{
    ? myVar;
}

2 个答案:

答案 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>();

upper bounded wildcards

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是类型参数,而通配符(或具体类型)是类型参数

相关问题