当前位置:  开发笔记 > 编程语言 > 正文

Java中的泛型,使用通配符

如何解决《Java中的泛型,使用通配符》经验,为你挑选了1个好方法。

我有一个关于Java中泛型的问题,即使用通配符.我有一个像这样的示例类GenClass:

public class GenClass {

    private E var;

    public void setVar(E x) {
        var = x;
    }

    public E getVar() {
        return var;
    }
}

我有另一个简单的类:

public class ExampleClass {

}

我写了以下测试类:

public class TestGenClass {

    public static void main(String[] str) {

        ExampleClass ec = new ExampleClass();

        GenClass c = new GenClass();

        c.setVar(ec);
        System.out.println(c.getVar());  // OUTPUT: ExampleClass@addbf1
    }

}

现在,如果我使用通配符并在测试类中写入:

GenClass c = new GenClass();

在以下的地方:

GenClass c = new GenClass();

编译器对这个新语句没有任何问题,但它抱怨

c.setVar(ec);

它说"方法(setVar())不适用于参数(ExampleClass)".为什么我收到此消息?

我认为我使用通配符的方式使得引用变量c的类型为GenClass,它将接受任何类作为参数 - 在EI的位置上将具有任何类.这只是变量的声明.然后我用它初始化它

new GenClass()

这意味着我创建了一个GenClass类型的对象,它具有一个类型为ExampleClass的参数.所以,我认为现在GenClass中的E将是ExampleClass,我将能够使用方法setVar(),将其作为类型为ExampleClass的参数.这是我的假设和理解,但似乎Java不喜欢它,我不对.任何评论表示赞赏,谢谢.



1> Michael Myer..:

Java Generics Tutorial中介绍了这种确切的情况.

请注意,[使用通配符],我们仍然可以从[泛型Collection]中读取元素并为其指定类型Object.这总是安全的,因为无论集合的实际类型如何,它都包含对象.然而,向它添加任意对象是不安全的:

Collection c = new ArrayList();
c.add(new Object()); // Compile time error

由于我们不知道元素类型c代表什么,因此我们无法向其添加对象.该add()方法接受类型的参数E,即集合的元素类型.当实际的类型参数是?,它代表一些未知类型.我们传递给的任何参数add都必须是这种未知类型的子类型.由于我们不知道它是什么类型,我们无法传递任何内容.唯一的例外是null,它是每种类型的成员.

(强调我的)

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有