Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法从类变量返回类型_Java_Generics_Wildcard - Fatal编程技术网

Java 方法从类变量返回类型

Java 方法从类变量返回类型,java,generics,wildcard,Java,Generics,Wildcard,鉴于以下类别: ... Class<? extends Enum<?>> enumType; public MyClass(Class<? extends Enum<?>> enumType) { super(); this.enumType=enumType; ... ,但这不起作用。使用类型参数而不是通配符。例如: class MyClass<T extends Enum<T>>

鉴于以下类别:

  ...

  Class<? extends Enum<?>> enumType;

  public MyClass(Class<? extends Enum<?>> enumType) {
    super();

    this.enumType=enumType;

  ...

,但这不起作用。

使用类型参数而不是通配符。例如:

class MyClass<T extends Enum<T>> {
    private Class<T> enumType;

    public MyClass(Class<T> enumType) {
        this.enumType = enumType;
    }

    public T getValue() {
        // ...
    }
}

实际上,您必须在泛型中指定一个变量,而不仅仅是到处使用通配符。然后就是这样,

public class MyClass<E extends EnumType<E>> {
    Class<E> enumType;
    E value;

    public MyClass(Class<E> enumType) {
        this.enumType = enumType;
    }

    public E getValue() {
        return value;
    }
}

首先,不要使用通配符。不能将enumType作为返回值!是的,我只是一直在尝试产生一个可接受的代码,这是一个。假设我不需要getValue方法,那么如何更好地编写上面的代码?给定您的代码,如何引用t类?我需要迭代T enum的所有值。你的方式让我遇到了另一个问题,那就是定义。MyClass myRef=新的MyClassMyEnum.class;我不想发布参数两次,但我遇到了一个问题,即如果我不将类作为参数提供,我就无法在构造函数中以任何方式引用t的任何属性。有关如何迭代枚举常量的信息,请参阅我的编辑。同样的问题仍然存在。我不想传递e,它由泛型参数确定。这就是我对它们进行迭代的方式,这也是我代码中MyClass不是泛型的原因,而是在构造函数中使用了一个类参数。如果不将类传递给枚举,就无法绕过这个问题。我这样使用它,但这样我需要创建一个新实例:MyClass Myref=MyClassMyEnum.Class;我不打算在定义中两次传递参数,原因有很多,比如MyClass的整个点都有问题,这是创建包含枚举值的组合框的最佳方法。换句话说,当MyEnum.classe是泛型时,我如何引用它?我找不到办法。@AttilaNeparáczki你实际上没有通过两次,只有一次;泛型类型仅在编译时被检查,然后被删除。您会注意到,所有基于枚举的泛型集合(如EnumMap)都有相同的要求。谢谢。有两个非常相似的答案,我接受了另一个,希望没有问题:
public <E extends Enum<E>> void showEnumValues(Class<E> e) {
    for (E value : e.getEnumConstants())
        System.out.println(value);
    }
}
public class MyClass<E extends EnumType<E>> {
    Class<E> enumType;
    E value;

    public MyClass(Class<E> enumType) {
        this.enumType = enumType;
    }

    public E getValue() {
        return value;
    }
}