【发布时间】:2016-03-30 12:15:16
【问题描述】:
给定以下 Java 代码:
public class Test {
public static class A<T> {
private T t;
public A(T t) {
this.t = t;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
public static class B<T> {
private T t;
public B(T t) {
this.t = t;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
public static class F<T> {
private T t;
public F(T t) {
this.t = t;
}
public A<B<T>> construct() {
return new A<>(new B<>(t));
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
public static void main(String[] args) {
F<?> f = new F<>(0);
// 1: KO
// A<B<?>> a = f.construct();
// 2: KO
// A<B<Object>> a = f.construct();
// 3: OK
// A<?> a = f.construct();
}
}
在Test 类的main 方法中,将接收f.construct() 结果的变量的正确类型是什么?
这种类型应该类似于A<B<...>>,其中... 是我正在寻找的。p>
上面有 3 行注释的代码代表我尝试解决这个问题。
第一行和第二行无效。
第三个是,但我丢失了B 类型信息,我必须转换a.getT()。
【问题讨论】:
-
你为什么用
F<?> f = new F<>(0);而不是,例如F<Integer> f = new F<>(0); -
因为
f并不总是受到F<Integer>实例的影响。 -
您将 0 作为参数传递。这是
int。 -
这是一个例子,
Integer可以替换成任何类型。 -
我现在无法检查,但我认为
A<? extends B<?>> a = f.construct();是您想要的。
标签: java generics java-7 nested-generics