我可以使用泛型转换此方法吗?

时间:2012-01-31 04:55:28

标签: java generics

我目前在一个类中有以下方法,我希望我可以推送到超类,因为我将有一些其他需要类似功能的类。

public long convertToLong(EnumSet<SomeTypeHere> es) {

  long a = 0;

  for(SomeTypeHere sth : es) {
     a += sth.someLongProperty();

  }
}

如果我能做到这一点会很棒,除了收藏之外,我从来没有真正使用过java泛型。

4 个答案:

答案 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()方法。

通常,交集类型可以解决您无法对枚举进行子类化的问题。