Java 为什么这个枚举没有';不编译?

Java 为什么这个枚举没有';不编译?,java,enums,compiler-errors,compiler-warnings,Java,Enums,Compiler Errors,Compiler Warnings,为什么这个枚举不编译 public enum Ackr implements Cloneable{ INSTANCE; public <Ackr extends Cloneable> Ackr getInstance(){ return INSTANCE; //Type mismatch: cannot convert from Ackr to Ackr // return (Ackr)INSTANCE; //Type safety: Un

为什么这个枚举不编译

public enum Ackr implements Cloneable{
    INSTANCE;

    public <Ackr extends Cloneable> Ackr getInstance(){
        return INSTANCE; //Type mismatch: cannot convert from Ackr to Ackr
//      return (Ackr)INSTANCE; //Type safety: Unchecked cast from Ackr to Ackr
    }
}
public enum Ackr实现可克隆{
实例;
公共Ackr getInstance(){
返回实例;//类型不匹配:无法从Ackr转换为Ackr
//return(Ackr)INSTANCE;//类型安全:未选中从Ackr到Ackr的强制转换
}
}

据我所知,该类型参数不是必需的。简单地尝试

public Ackr getInstance(){
    return INSTANCE;
}

你想用这个签名实现什么

public <Ackr extends Cloneable> Ackr getInstance() ...


我还认为扩展
Clonable
enum
有点荒谬。无法复制
枚举
。。。枚举的值只有一个。

我发现您对泛型有误解。。Enum class
Ackr
与您在注释中编写的类型
不同:


我认为没有理由使用
,但是在什么情况下这种构造才有意义呢

这是方法的类型参数

public <Ackr extends Cloneable> Ackr getInstance(){ ... }
Java API中的一些示例仅在返回类型中使用类型参数,但它们返回一些参数化类型(方法的类型参数用作返回类型的类型参数)。例如,查找集合.emptySet()

更常见的情况是,在方法的参数类型中使用方法的类型参数(仅用于或附加于返回类型)

public一个getFirstElement(Iterable列表);
此方法获取某个类型A的Iterable,并返回该类型A的对象(从名称可以假设它获取该Iterable的第一个元素)。以下是一个实现:

 public <A> A getFirstElement(Iterable<A> list) {
     Iterator<A> it = list.iterator();
     if(it.hasNext()) {
         return it.next();
     }
     return null;
 }
public一个getFirstElement(Iterable列表){
Iterator it=list.Iterator();
if(it.hasNext()){
返回它。下一步();
}
返回null;
}
一般情况下:如果您有一个类型参数(在任何地方),请确保您没有将其命名为与某个现有类型相同的名称(就像您在这里所做的那样)-它将隐藏您的现有类型,由于奇怪的错误消息(如Ackr不可分配给Ackr)而导致严重混乱


这就是类型参数通常有一个(或很少有两个)字符名的原因,例如
E
(元素类型)、
K
V
(映射的键和值类型)、
T
(一般类型)。

仅仅
公共Ackr getInstance(){…}/code>有什么问题?或者,就这一点而言,为什么您需要
getInstance()
呢?您不能克隆枚举。。。这根本没有意义。我认为没有理由使用
,但是在什么情况下这种构造才有意义呢?我认为您需要阅读关于泛型的Java教程。它将更好地解释这类事情。
public <A extends Cloneable> A getInstance(){ ... }
 public <A> A getFirstElement(Iterable<A> list);
 public <A> A getFirstElement(Iterable<A> list) {
     Iterator<A> it = list.iterator();
     if(it.hasNext()) {
         return it.next();
     }
     return null;
 }