Java返回类型泛型

时间:2017-06-05 06:38:05

标签: java generics

我在java中使用泛型的新手,我有简单的方法,我想从中返回任何类型,此方法返回其他类getters方法,例如我有{{1} } class和channels方法,我想从这个方法返回:

getChannelId()

@SuppressWarnings("unchecked") public <T extends Channels> T getChannelColumn(ChannelContentModel.channelColumns column) { switch (column) { case id: return (T) channel.getId(); break; case title: return (T) channel.getChannelTitle(); break; } return null; } 是int,getId是字符串,如何修复此方法以返回任何类型?

我的代码getChannelTitle中的

channel类的实例,提前致谢

2 个答案:

答案 0 :(得分:0)

由@Geckstar评论;

  

Java是静态类型的

但是可以从编译错误中清除代码示例。

  1. 删除中断,因为在返回语句后无需中断。
  2. 从对象扩展返回类型。 T扩展了Object而不是T扩展Channel
  3. id必须是Integer,而不是int或更改为(T)(Integer)channel.getId()
  4.   

    这不是一个好的解决方案,它只能修复编译错误。但是这种方法的使用可能会导致运行时失败。

    @SuppressWarnings("unchecked")
    public <T extends Object> T getChannelColumn(ChannelContentModel.channelColumns column) {
        switch (column) {
            case id:
                return (T) channel.getId(); //int must be Integer
            case title:
                return (T) channel.getChannelTitle();
        }
        return null;
    }
    

答案 1 :(得分:0)

您可以创建属性包装器,它将在需要时将字符串数据格式保存为特定数据类型。

public class MyProperty {
private String stringVal;

public MyProperty(String stringVal) {
    this.stringVal = stringVal;
}

public Integer getInteger() throws IllegalArgumentException {
    return integerValue.getValue();
}

public String getString() {
    return stringValue.getValue();
}

private PropertyValue<String> stringValue = new PropertyValue<String>() {
    protected String parse(String rep) {
        return rep;
    }
};
private PropertyValue<Integer> integerValue = new PropertyValue<Integer>() {
    protected Integer parse(String rep) throws NumberFormatException {
        return Integer.valueOf(rep);
    }
};

private abstract class PropertyValue<T> {
    private T value;

    protected abstract T parse(String rep) throws Exception;

    public T getValue() throws IllegalArgumentException {
        try {
            value = (stringValue == null) ? null : parse(stringVal);
        } catch (Exception e) {
            value = null;
        }
        return value;
    }
}

}

你可以使用具有访问方法的specialize类或一个类来获取具有指定数据类型的值

   @SuppressWarnings("unchecked")
    public  MyProperty getChannelColumn(ChannelContentModel.channelColumns column) {
        switch (column) {
            case id:
                return new MyProperty(channel.getId());//
            break;
            case title:
                return new MyProperty(channel.getChannelTitle());
                break;
        }
        return null;
    }