【发布时间】:2016-07-19 04:04:15
【问题描述】:
考虑以下示例:
class First<T >
{
T s;
First(T s)
{
this.s=s;
}
void setS(T s)
{
this.s=s;
}
void getS()
{
System.out.println(s);
}
}
class Use
{
public static void setFirst(First<?>f)
{
f.setS(7);
}
public static void main(String[] args)
{
First <Integer> f4 = new First<Integer>(5);
f4.getS();
setFirst(f4);
}
}
我知道编译器会报错,因为在形式参数使用泛型通配符的方法中不允许写入特定操作。编译错误是:
gyan@ns:~/codes/java/generics$ javac -Xdiags:verbose *.java
Use.java:5: error: method setS in class First<T> cannot be applied to given types;
f.setS(7);
^
required: CAP#1
found: int
reason: argument mismatch; int cannot be converted to CAP#1
where T is a type-variable:
T extends Object declared in class First
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ?
1 error
gyan@ns:~/codes/java/generics$
看起来 CAP#1 是一种数据类型。我对这个概念一无所知。请帮忙。
【问题讨论】:
标签: java generics parameter-passing wildcard