使用通配符泛型编译
Compiling with wildcard generics
我正在准备 Java OCP 考试,遇到了这个问题
给定以下代码:
Transaction t1 = new Transaction<>(1, 2); //1
Transaction t2 = new Transaction<>(1, "2"); //2
要求//1必须编译,//2不能编译。 class 事务的以下哪些声明将满足请求?
答案是这个:
public class Transaction<T, S extends T> {
public Transaction(T t, S s) {
}
}
我明白了。但是当我将这段代码放入 Eclipse 项目时,它就可以工作了!这是我的代码:
class TransactionD<T, S extends T> {
public TransactionD(T t, S s){
System.out.println("D: t: " + t.getClass() + " s: " + s.getClass());
}
}
public class Test1
{
public static void main(String[] args) {
TransactionD d1 = new TransactionD<>(1, 2); //1
TransactionD d2 = new TransactionD<>(1, "2"); //2
}
}
我的输出是这样的:
D: t: class java.lang.Integer s: class java.lang.Integer
D: t: class java.lang.Integer s: class java.lang.String
我的问题是:我错过了什么?
由于您在声明中使用原始类型,因此您实际上使用的是 TransactionD<Object, Object>
,这使得调用有效,因为根据 java 泛型,Object
扩展 Object
,Integer
和 String
也扩展了 Object.
我正在准备 Java OCP 考试,遇到了这个问题
给定以下代码:
Transaction t1 = new Transaction<>(1, 2); //1
Transaction t2 = new Transaction<>(1, "2"); //2
要求//1必须编译,//2不能编译。 class 事务的以下哪些声明将满足请求?
答案是这个:
public class Transaction<T, S extends T> {
public Transaction(T t, S s) {
}
}
我明白了。但是当我将这段代码放入 Eclipse 项目时,它就可以工作了!这是我的代码:
class TransactionD<T, S extends T> {
public TransactionD(T t, S s){
System.out.println("D: t: " + t.getClass() + " s: " + s.getClass());
}
}
public class Test1
{
public static void main(String[] args) {
TransactionD d1 = new TransactionD<>(1, 2); //1
TransactionD d2 = new TransactionD<>(1, "2"); //2
}
}
我的输出是这样的:
D: t: class java.lang.Integer s: class java.lang.Integer
D: t: class java.lang.Integer s: class java.lang.String
我的问题是:我错过了什么?
由于您在声明中使用原始类型,因此您实际上使用的是 TransactionD<Object, Object>
,这使得调用有效,因为根据 java 泛型,Object
扩展 Object
,Integer
和 String
也扩展了 Object.