我目前在一个类中有以下方法,我希望我可以推送到超类,因为我将有一些其他需要类似功能的类。
public long convertToLong(EnumSet<SomeTypeHere> es) {
long a = 0;
for(SomeTypeHere sth : es) {
a += sth.someLongProperty();
}
}
如果我能做到这一点会很棒,除了收藏之外,我从来没有真正使用过java泛型。
答案 0 :(得分:3)
您需要对泛型类型设置绑定。如果包含convertToLong
的类在同一类型上进行参数化,则可以将绑定放在那里:
import java.util.*;
public class GenericTest<C extends GenericTest.HasLongProperty> {
static interface HasLongProperty {
long someLongProperty();
}
public long convertToLong(Collection<C> es) {
long a = 0;
for(C sth : es)
a += sth.someLongProperty();
return a;
}
}
或者,如果包含convertToLong
的类不是通用的,则可以将绑定放在该方法的声明中:
import java.util.*;
public class GenericTest {
static interface HasLongProperty {
long someLongProperty();
}
public <C extends GenericTest.HasLongProperty> long convertToLong(Collection<C> es) {
long a = 0;
for(C sth : es)
a += sth.someLongProperty();
return a;
}
}
答案 1 :(得分:2)
我想你想要这样的东西:
public <T extends SomeType> long convertToLong(Collection<T> es) {
long a = 0;
for(T sth : es) {
a += sth.someLongProperty();
}
return a;
}
这表示你可以传入一个类型为T的集合,其中T可以是SomeType的任何子类,SomeType具有someLongProperty函数。
答案 2 :(得分:2)
以下代码可满足您的需求。关键是使用将类型绑定到多个类型的通用语法 - 在本例中为Enum 和您的接口。
编译:
public interface HasSomeLongProperty {
long someLongProperty();
}
public static enum Fruit implements HasSomeLongProperty {
apple(1),
orange() {
// You may override the default implementation and delegate
public long someLongProperty() {
// You could also make this a field and not new every call
new SomeHasSomeLongPropertyImpl().someLongProperty();
}
};
private long value;
private Fruit() {
}
private Fruit(long value) {
this.value = value;
}
public long someLongProperty() {
return value;
}
}
public static <T extends Enum<T> & HasSomeLongProperty> long convertToLong(EnumSet<T> es) {
long a = 0;
for (T sth : es)
a += sth.someLongProperty();
return a;
}
答案 3 :(得分:0)
是的 - java交集类型(波西米亚的答案)做你想要的。我有一个类似的问题,我有一些枚举类,我都想要一个getDescription()方法。
通常,交集类型可以解决您无法对枚举进行子类化的问题。