【问题标题】:in Java syntax, Class<? extends Something>在 Java 语法中,Class<?扩展一些东西>
【发布时间】:2012-01-15 09:48:22
【问题描述】:

Class&lt;? extends Something&gt;

这是我的解释,它是类模板,但类?表示类的名称未确定,它扩展了 Something 类。

如果我的解释有问题,请告诉我。

【问题讨论】:

标签: java generics


【解决方案1】:

这里有一些令人困惑的答案,所以我会尝试解决这个问题。 你这样定义一个泛型:

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 继承的类中的任何对象都会具有相同的行为。我错过了什么吗?提前致谢!
  • 回答我自己的问题:stackoverflow.com/questions/2922811/…
  • 等等 - 我认为原始发帖人是专门询问 Class 类型的。
【解决方案2】:

你几乎是对的。 基本上,Java 没有模板的概念(C++ 有)。 这称为泛型。 这定义了一个泛型类Class&lt;&gt;,泛型的属性是Something 的任何子类。

如果你想了解模板和泛型之间的区别,我建议阅读“What are the differences between “generic” types in C++ and Java?”。

【讨论】:

    【解决方案3】:

    你是对的

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

    Class&lt;T&gt;一样,但是有一个条件T必须extends Something 或者 implements Something Anthony Accioly 建议的

    也可以是类Something本身

    【讨论】:

    • 或者实现Something接口...在处理泛型时“extends”用于两者。
    【解决方案4】:

    你是对的。

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

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

    【讨论】:

    • ? 在技术上不是 操作员
    • @Jesper: true - 我使用 operator 作为比喻,但我想 wildcard 可能更合适。
    【解决方案5】:

    你是对的。

    但是通常你会想要命名扩展Something的类并写例如&lt;E extends Something&gt;。如果你使用?,你以后不能对给定的类型做任何事情。

    【讨论】:

      猜你喜欢
      • 2022-12-24
      • 2020-03-12
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 2019-04-11
      相关资源
      最近更新 更多