java - 泛型中类型参数中的常量

标签 java generics constants wildcard extends

我正在阅读 Thinking in java 第 4 版,我遇到了这段代码

class SuperHero<POWER extends SuperPower> {
    POWER power;

    SuperHero(POWER power) {
        this.power = power;
    }

    POWER getPower() {
        return power;
    }
}

我查看了这段代码的整个类定义,但似乎找不到关键字 POWER,所以我假设它是一个常量?在这种情况下,“POWER”实际上是什么?

这是整个类的定义

package tij4.generics;

//: generics/EpicBattle.java
//Demonstrating bounds in Java generics.
import java.util.*;

//Marker Interface
interface SuperPower {
}

interface XRayVision extends SuperPower {
    void seeThroughWalls();
}

interface SuperHearing extends SuperPower {
    void hearSubtleNoises();
}

interface SuperSmell extends SuperPower {
    void trackBySmell();
}

class SuperHero<POWER extends SuperPower> {
    POWER power;

    SuperHero(POWER power) {
        this.power = power;
    }

    POWER getPower() {
        return power;
    }
}

class SuperSleuth<POWER extends XRayVision> extends SuperHero<POWER> {
    SuperSleuth(POWER power) {
        super(power);
    }

    void see() {
        power.seeThroughWalls();
    }
}

class CanineHero<POWER extends SuperHearing & SuperSmell> extends
        SuperHero<POWER> {
    CanineHero(POWER power) {
        super(power);
    }

    void hear() {
        power.hearSubtleNoises();
    }

    void smell() {
        power.trackBySmell();
    }
}

class SuperHearSmell implements SuperHearing, SuperSmell {
    public void hearSubtleNoises() {
    }

    public void trackBySmell() {
    }
}

class DogBoy extends CanineHero<SuperHearSmell> {
    DogBoy() {
        super(new SuperHearSmell());
    }
}

public class EpicBattle {
    // Bounds in generic methods:
    static <POWER extends SuperHearing> void useSuperHearing(
            SuperHero<POWER> hero) {
        hero.getPower().hearSubtleNoises();
    }

    static <POWER extends SuperHearing & SuperSmell> void superFind(
            SuperHero<POWER> hero) {
        hero.getPower().hearSubtleNoises();
        hero.getPower().trackBySmell();
    }

    public static void main(String[] args) {
        DogBoy dogBoy = new DogBoy();
        useSuperHearing(dogBoy);
        superFind(dogBoy);
        // You can do this:
        List<? extends SuperHearing> audioBoys;
        // But you can't do this:
        // List<? extends SuperHearing & SuperSmell> dogBoys;
    }
} // /:~

添加信息: 我还查看了这个包中包含的不同类。并且它们都没有定义枚举“POWER”

最佳答案

它只是一个通用的类型名称,就像T一样。在java.util.List<T> .作者只是为这种类型选择了一个更大的名字。

关于java - 泛型中类型参数中的常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12275190/

相关文章:

java - 定期更新 Rome 的 RSS feed

c++ - Sizeof() 函数不适用于常量数组 C++

java - 为什么我在低通滤波器循环中收到 IndexOutOfBoundsException 错误?

Java 代码未打印到 Eclipse 中的控制台

arrays - Swift 从包含类元素的数组中返回类型的对象

generics - 如何使用 Guava Optional 作为 "naturally covariant object"

c++ - 强制转换运算符 - const 与非 const

java - 在 param 中传递类常量

java - 范围内的随机数

java - 如何在静态泛型工厂方法中避免 "Type mismatch"?