【问题标题】:Java generic bound by custom interface自定义接口绑定的 Java 泛型
【发布时间】:2020-10-31 20:17:28
【问题描述】:

我想要一个通用类 A,它的“值”只能是 JSON 可序列化对象。为此,我选择自己实现接口。问题是我想避免以下用法:

A a = new A("name", new BooleanType(false)); // I would like to just pass false as the argument

我的设置是这样的:

Class A <T extends Type> {
    private String name;
    private T value;

    //getter...
}

--

Interface Type {
   Object value;
}

--

Class BooleanType implements Type {
    private Boolean value;

    public BooleanType(Boolean value){
        this.value = value;
    }

}

其他类型实现者...

我的一个想法是为 A 类中的每个类型都有一个方法:

Class A <T extends Type> {
    private String name;
    private T value;

    public static A of(String name, Boolean value){
        this.name = name;
        this.value = value;
    }

    //of implementations for Integer, LocalDatetime, etc

    //getter...
}

我可以在 A 中没有多个方法来创建每种不同类型的情况下实现这一点吗?

【问题讨论】:

    标签: java class generics types interface


    【解决方案1】:

    您正在制造问题。要删除上限要求,您需要删除接口。您不需要接口,因为 Gson 支持所有*对象和原语。

    话虽如此,如果你想让A 类允许键值对,你可以有一个参数V 代表value 并提供一个默认类型。然后使用适配器模式来实现该接口并将其组合成相关对象。

    interface MyType<V> {
    
        String name();
        
        V value();
    
    }
    
    class MyTypeAdapter<V> implements MyType<V> {
    
        private final String name;
    
        private final V value;
    
        public MyTypeAdapter(String name, V value) { 
            this.name = name;
            this.value = value;
        }
    
        @Override
        public V value() {
            return value;
        }
    
        @Override
        public String name() {
            return name;
        }
    
    } 
    
    MyType<Boolean> myTypeAdapter = new MyTypeAdapter<>("foo", false);
    
    boolean value = myTypeAdapter.value();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 2020-03-22
      相关资源
      最近更新 更多