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 classAckr
与您在注释中编写的类型不同:
我认为没有理由使用
,但是在什么情况下这种构造才有意义呢
这是方法的类型参数
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;
}