我们可以在java中使用类级别的通配符吗?

时间:2015-09-06 08:40:00

标签: java generics

我尝试在课程级别使用通配符,我收到以下错误

 Test.java:3: error: <identifier> expected
class Test1<? extends Object,Cloneable,Serializable>
            ^
Test.java:3: error: '{' expected
class Test1<? extends Object,Cloneable,Serializable>
                            ^

4 个答案:

答案 0 :(得分:2)

在类定义中使用通配符实际上没有意义。

例如:

class MyClass<T extends MyInterface>

您需要T,您可以在成员private T myT或方法void doIt(T t)之类的课程中使用它。

具有您无法使用的通用类型会有什么意义?

通配符泛型是Java处理variance

的方式

答案 1 :(得分:1)

你不能。

来自Wiki of WildCard

  

通配符? Java中是泛型(参数化)类型实例化的特殊实际参数。它可以用于实例化,而不是用于通用单元的定义。

答案 2 :(得分:1)

No We cannot use Wildcards at the class level.

Below syntax are not allowed:
1. class A<?>{}
2. class A<? extends Number>{}
3. new ArrayList<?>();
4. ArrayList<?> al5=new ArrayList<?>();
5. ArrayList<? extends Number> al9=new ArrayList<?>();

Allowed are:

1.ArrayList<?> al=new ArrayList<String>();
2.ArrayList<?> al2=new ArrayList();
3.ArrayList<? extends Runnable> al3=new ArrayList();
4.ArrayList<? super Runnable> al4=new ArrayList();
5.ArrayList<? super Runnable> al5=new ArrayList<Object>();
6.ArrayList<? super Runnable> al6=new ArrayList<Runnable>();
7.ArrayList<? extends Runnable> al7=new ArrayList<Runnable>();
8.ArrayList<? extends Runnable> al8=new ArrayList<Thread>();
9.ArrayList<? extends Object> al9=new ArrayList<Double>();

答案 3 :(得分:-1)

错误说添加<identifier> 而不是?替换为例如T. 例如:

class Test1<T extends Object,Cloneable,Serializable>

因为使用Class,你需要添加一些标识符,这与方法不同!