在Java语法中,Class<? extends Something>的意思是什么?

64

Class<? extends Something>

的翻译是:这是一个类模板,但是问号表示该类名未确定,它继承自Something类。

如果我的翻译有误,请告诉我。


3
“?”表示该类的“类型”尚未确定,但可以保证它是扩展了“Something”的。 - Hunter McMillen
1
请参考以下链接:http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html - Daniel Moses
5个回答

53
这里有一些令人困惑的答案,我会尝试澄清一下。定义泛型的方式如下:
public class Foo<T> {
    private T t;
    public void setValue(T t) {
        this.t = t;
    }
    public T getValue() {
        return t;
    }
}

如果您想让一个名为Foo的泛型始终扩展类Bar,您需要这样声明:

public class Foo<T extends Bar> {
    private T t;
    public void setValue(T t) {
        this.t = t;
    }
    public T getValue() {
        return t;
    }
}

当你声明变量时,使用

Foo<? extends Bar>foo = getFoo();

或者

DoSomething(List<? extends Bar> listOfBarObjects) {
    //internals
}

根据您的解释,我有一个问题。以那种方式声明变量和直接使用Bar类之间有什么区别?就我所知,从继承自Bar的类中创建的任何对象都将具有相同的行为。我有什么遗漏的吗?提前感谢! - Erizo
回答自己的问题:https://dev59.com/33A85IYBdhLWcg3wJf8a - Erizo
等一下 - 我认为原帖的作者特别是在询问类类型。 - rrrrrrrrrrrrrrrr

37

你的理解基本正确。 Java基本上没有模板的概念(C++有), 这被称为泛型。 并且使用泛型定义了一个通用类Class<>,其中泛型属性可以是 Something 的任何子类。

如果你想了解模板和泛型之间的区别,请阅读“C++和Java中“generic”类型的区别是什么?”。


10

你说得对

定义是该类必须是Something的子类型

它与Class<T>相同,但有一个条件,即T必须extends Somethingimplements Something,如Anthony Accioly所建议的那样。

它也可以是类Something本身


3
实现Something接口……在处理泛型时,“extends”用于两者。 - Anthony Accioly

8

你说得对。

在Java泛型中,?运算符表示“任意类”。extends关键字可以用来限定为“扩展/实现Something(或Something)的任意类”。

因此,你有“某个类的Class,但该类必须是Something或者扩展/实现Something”。


? 在这里技术上不是一个运算符 - Jesper
1
@Jesper:没错 - 我之前是用“operator”来比喻,但我猜“通配符”可能更合适。 - Mac

4

你说得对。

然而,通常你会想要给继承Something的类命名,并写成例如<E extends Something>。如果使用?,你以后将无法对给定类型进行任何操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,