最近在搞3G的研究, 发现android的java代码中有这样三个类Lists, Maps, Sets. 这让我想到和大家分享
首先以前我们写的泛型类List<Integer> list = new ArrayList<Integer>();
显然右边的泛型和左面一样, 能不能不写. 在7月要发版的jdk1.7中有菱形语法
List<Integer> list = new ArrayList<>(); , 但这在1.7之前的所有jdk中都不支持. 能不能有一种
办法可以在之前的所有jdk中不写右边的泛型, 而且没有警告. 看看Lists这个类吧
public class Lists {
/**
* Creates an empty {@code ArrayList} instance.
*
* <p><b>Note:</b> if you only need an <i>immutable</i> empty List, use
* {@link Collections#emptyList} instead.
*
* @return a newly-created, initially-empty {@code ArrayList}
*/
public static <E> ArrayList<E> newArrayList() {
return new ArrayList<E>();
}
显然当我们调用时, 只要 List<Integer> list = Lists.newArrayList(); 在这个方法内部的泛型已经传入类型, 而且代码比直接new
还要短.
以下贴出代码:
Lists:
import java.util.ArrayList;
import java.util.Collections;
/**
* Provides static methods for creating {@code List} instances easily, and other
* utility methods for working with lists.
*/
public class Lists {
/**
* Creates an empty {@code ArrayList} instance.
*
* <p><b>Note:</b> if you only need an <i>immutable</i> empty List, use
* {@link Collections#emptyList} instead.
*
* @return a newly-created, initially-empty {@code ArrayList}
*/
public static <E> ArrayList<E> newArrayList() {
return new ArrayList<E>();
}
/**
* Creates a resizable {@code ArrayList} instance containing the given
* elements.
*
* <p><b>Note:</b> due to a bug in javac 1.5.0_06, we cannot support the
* following:
*
* <p>{@code List<Base> list = Lists.newArrayList(sub1, sub2);}
*
* <p>where {@code sub1} and {@code sub2} are references to subtypes of
* {@code Base}, not of {@code Base} itself. To get around this, you must
* use:
*
* <p>{@code List<Base> list = Lists.<Base>newArrayList(sub1, sub2);}
*
* @param elements the elements that the list should contain, in order
* @return a newly-created {@code ArrayList} containing those elements
*/
public static <E> ArrayList<E> newArrayList(E... elements) {
int capacity = (elements.length * 110) / 100 + 5;
ArrayList<E> list = new ArrayList<E>(capacity);
Collections.addAll(list, elements);
return list;
}
}
Maps:
import java.util.HashMap;
/**
* Provides static methods for creating mutable {@code Maps} instances easily.
*/
public class Maps {
/**
* Creates a {@code HashMap} instance.
*
* @return a newly-created, initially-empty {@code HashMap}
*/
public static <K, V> HashMap<K, V> newHashMap() {
return new HashMap<K, V>();
}
}
Sets:
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.collect;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.SortedSet;
import java.util.TreeSet;
/**
* Provides static methods for creating mutable {@code Set} instances easily and
* other static methods for working with Sets.
*
*/
public class Sets {
/**
* Creates an empty {@code HashSet} instance.
*
* <p><b>Note:</b> if {@code E} is an {@link Enum} type, use {@link
* EnumSet#noneOf} instead.
*
* <p><b>Note:</b> if you only need an <i>immutable</i> empty Set,
* use {@link Collections#emptySet} instead.
*
* @return a newly-created, initially-empty {@code HashSet}
*/
public static <K> HashSet<K> newHashSet() {
return new HashSet<K>();
}
/**
* Creates a {@code HashSet} instance containing the given elements.
*
* <p><b>Note:</b> due to a bug in javac 1.5.0_06, we cannot support the
* following:
*
* <p>{@code Set<Base> set = Sets.newHashSet(sub1, sub2);}
*
* <p>where {@code sub1} and {@code sub2} are references to subtypes of {@code
* Base}, not of {@code Base} itself. To get around this, you must use:
*
* <p>{@code Set<Base> set = Sets.<Base>newHashSet(sub1, sub2);}
*
* @param elements the elements that the set should contain
* @return a newly-created {@code HashSet} containing those elements (minus
* duplicates)
*/
public static <E> HashSet<E> newHashSet(E... elements) {
int capacity = elements.length * 4 / 3 + 1;
HashSet<E> set = new HashSet<E>(capacity);
Collections.addAll(set, elements);
return set;
}
/**
* Creates an empty {@code SortedSet} instance.
*
* @return a newly-created, initially-empty {@code SortedSet}.
*/
public static <E> SortedSet<E> newSortedSet() {
return new TreeSet<E>();
}
/**
* Creates a {@code SortedSet} instance containing the given elements.
*
* @param elements the elements that the set should contain
* @return a newly-created {@code SortedSet} containing those elements (minus
* duplicates)
*/
public static <E> SortedSet<E> newSortedSet(E... elements) {
SortedSet<E> set = new TreeSet<E>();
Collections.addAll(set, elements);
return set;
}
}