有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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);
    }
}

如果我的想法有一个根本缺陷的话,那它是什么呢?我应该采取什么样的方式


共 (2) 个答案

  1. # 1 楼答案

    编辑后:

        // I can do this:
        c.set(c.get());
    

    不,你不能。它不会在cCalledInterface<?>的情况下编译。(你试过了吗?)

    为此,您可以使用“捕获助手”:

    private static <T> void helper(CalledInterface<T> c) {
        c.set(c.get());
    }
    public void run(){
        helper(c);
    }
    

    这也解决了你的第二个问题:

    private static <T> void helper(CalledInterface<T> c) {
        T element = c.get();
        c.set(element);
    }
    public void run(){
        helper(c);
    }
    
  2. # 2 楼答案

    代码中有几个小错误:

    protected Called c;
    
    public Caller (CalledInterface arg) {
        c = arg;
    }
    

    不允许在此处分配arg,因为类型CalledInterface不是Called的子类型(反之亦然) 此外,在使用CalledInterface时,还应该提供类型信息(可以省略它,但仅限于遗留用途)

    现在来谈谈你想知道的部分。对于类型Called,编译器知道get()返回一个String,如果您对此不感兴趣,当然可以始终使用Object作为element的类型。编译器还知道set()String作为参数,因此它要求您给出一个参数。在泛型中使用Object与在没有泛型的情况下使用Object基本相同(尽管在使用它的位置不允许使用,因为这没有意义)。这意味着您将告诉编译器忘记第一行(调用get())上的类型,并在下面的一行取消它的格式化