java我可以使用调用类中的泛型类型吗?
我目前正在复习Java,阅读泛型。因为在我的Java课程中没有对它们进行过广泛的讨论,所以我仍然很难理解它,所以在回答时请记住这一点
首先,我很确定我所尝试的是不可能的。然而,我想找出我的想法错在哪里,以及我应该如何实现我想要的
我要做的是操纵一个对象,该对象从另一个不知道实例化类型的类实现一个泛型接口。因此,我有如下课程:
public interface CalledInterface<E> {
public E get() { ... }
public set(E e) { ... }
}
public class Called implements CalledInterface<String> {
...
}
现在我想做的是:
public class Caller {
protected CalledInterface<?> c;
public Caller (CalledInterface<?> arg) {
c = arg;
}
public void run(){
// I can do this:
c.set(c.get());
// But I'd want to be able to do something like:
<?> element = c.get();
c.set(element);
}
}
如果我的想法有一个根本缺陷的话,那它是什么呢?我应该采取什么样的方式
# 1 楼答案
编辑后:
不,你不能。它不会在
c
为CalledInterface<?>
的情况下编译。(你试过了吗?)为此,您可以使用“捕获助手”:
这也解决了你的第二个问题:
# 2 楼答案
代码中有几个小错误:
不允许在此处分配
arg
,因为类型CalledInterface
不是Called
的子类型(反之亦然) 此外,在使用CalledInterface
时,还应该提供类型信息(可以省略它,但仅限于遗留用途)现在来谈谈你想知道的部分。对于类型
Called
,编译器知道get()
返回一个String
,如果您对此不感兴趣,当然可以始终使用Object
作为element
的类型。编译器还知道set()
将String
作为参数,因此它要求您给出一个参数。在泛型中使用Object
与在没有泛型的情况下使用Object
基本相同(尽管在使用它的位置不允许使用,因为这没有意义)。这意味着您将告诉编译器忘记第一行(调用get()
)上的类型,并在下面的一行取消它的格式化