加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 有没有办法避免构造函数传递类?

发布时间:2020-12-14 05:48:05 所属栏目:Java 来源:网络整理
导读:考虑这个HashMap扩展(如果它为null,则在调用“get”时生成V类的实例) public class HashMapSafeK,V extends HashMapK,V implements MapK,V{ private ClassV dataType; public HashMapSafe(ClassV clazz){ dataType = clazz; } @SuppressWarnings("unchecked"
考虑这个HashMap扩展(如果它为null,则在调用“get”时生成V类的实例)
public class HashMapSafe<K,V> extends HashMap<K,V> implements Map<K,V>{

    private Class<V> dataType;

    public HashMapSafe(Class<V> clazz){
        dataType = clazz;
    }
    @SuppressWarnings("unchecked")
    @Override
    public V get(Object key) {
        if(!containsKey(key)){
            try {
                put((K)key,dataType.newInstance());
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return super.get(key);
    }
}

它的用法是这样的

Map<String,Section> sections = new HashMapSafe<String,Section>(Section.class);
sections.get(sectionName); //always returns a Section instance,existing or new

在我看来,两次提供“部分”一次多余,一次作为通用类型,并且还提供它的类.我认为这是不可能的,但是有没有实现HashMapSafe,(保持相同的功能)所以它可以像这样使用?

Map<String,Section>();

或者像这样?:

Map<String,Section> sections = new HashMapSafe<String>(Section.class);

解决方法

正如其他人已经指出的那样,由于类型擦除,你无法改善构造函数的使用,但是你应该能够通过使用静态工厂方法而不是构造函数来提高详细程度……

我不是在编译器前面,我在第一次尝试时永远无法获得方法类型参数,但它会像这样……

public static <K,V> Map<K,V> create( Class<V> cl )
{
    return new HashMapSafe<K,V>(cl);
}

...

Map<String,Section> sections = HashMapSafe.create(Section.class);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读