论坛首页 Java企业应用论坛

[收集]java最蛋疼、怪异的语法与类库设计

浏览 12396 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (6)
作者 正文
   发表时间:2011-12-28  
class TestMap<K extends Object, V extends Vector<? extends Vector<? extends Vector>>>
extends Hashtable<K, V> {

}

Vector<? extends Vector<? extends Vector>>只要是 ? extends 可以无穷无尽
0 请登录后投票
   发表时间:2011-12-28  
public class HashMap<K,V>
    extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable
{

public void putAll(Map<? extends K, ? extends V> m) {
        int numKeysToBeAdded = m.size();
        if (numKeysToBeAdded == 0)
            return;

        /*
         * Expand the map if the map if the number of mappings to be added
         * is greater than or equal to threshold.  This is conservative; the
         * obvious condition is (m.size() + size) >= threshold, but this
         * condition could result in a map with twice the appropriate capacity,
         * if the keys to be added overlap with the keys already in this map.
         * By using the conservative calculation, we subject ourself
         * to at most one extra resize.
         */
        if (numKeysToBeAdded > threshold) {
            int targetCapacity = (int)(numKeysToBeAdded / loadFactor + 1);
            if (targetCapacity > MAXIMUM_CAPACITY)
                targetCapacity = MAXIMUM_CAPACITY;
            int newCapacity = table.length;
            while (newCapacity < targetCapacity)
                newCapacity <<= 1;
            if (newCapacity > table.length)
                resize(newCapacity);
        }

        for (Iterator<? extends Map.Entry<? extends K, ? extends V>> i = m.entrySet().iterator(); i.hasNext(); ) {
            Map.Entry<? extends K, ? extends V> e = i.next();
            put(e.getKey(), e.getValue());
        }
    }

}HashMap里面的源码
0 请登录后投票
   发表时间:2011-12-28   最后修改:2011-12-28
传送门:NS的老帖一枚http://www.iteye.com/topic/412868
0 请登录后投票
   发表时间:2011-12-28  
weiqiang.yang 写道
我觉得这个比较怪异。。。
String[] list = new String[]{
            "1234",
            "1234",
            "1234", // <-- 注意这个逗号。。。居然是ok的
        };


list.length = 3



数组的最后一个元素是可以有逗号的
0 请登录后投票
   发表时间:2011-12-28  
ticmy 写道
看了这个帖子 http://stackoverflow.com/questions/1995113/strangest-language-feature觉得挺有意思,开个贴专门收集一下java最蛋疼、怪异的语法与类库设计。


那个帖子里面有这么个语法,挺有意思:

	public String getArray()[] {
		return new String[]{"a","b","c"};
	}



还有哪些大家觉得比较蛋疼和怪异的呢


private static void testOverloading(int... args) {
	}

private static void testOverloading(Integer... args) {
	}


这两个方法可以共存,但无法调用
public static int sum(List<Integer> ints) {

		return 0;
	}

public static String sum(List<String> strings) {
		return "";
	}


上面两个方法同样可以共存,但无法调用。

我觉得还是泛型和autoboxing比较蛋疼
0 请登录后投票
   发表时间:2011-12-28  
Integer[] a = new Integer[]{1};
int[] b = new int[]{1};
testOverloading(a);
testOverloading(b); 可以调用


public static int sum(List<Integer> ints) { 
 
        return 0; 


public static String sum(List<String> strings) { 
      return ""; 


两个方法不能同时存在
0 请登录后投票
   发表时间:2011-12-28  
smallgaogao1 写道
Integer[] a = new Integer[]{1};
int[] b = new int[]{1};
testOverloading(a);
testOverloading(b); 可以调用


public static int sum(List<Integer> ints) { 
 
        return 0; 


public static String sum(List<String> strings) { 
      return ""; 


两个方法不能同时存在



+1
0 请登录后投票
   发表时间:2011-12-29   最后修改:2011-12-29
搞清楚其原理和用途, 就不会觉得怪异,

比如一:
引用
enum Test{   
   instace(); //加不加括号都行,反正调用的时候是 Test.instance
}


此处加括号是调用构造函数,并不怪异。
不但可以调用构造,还可以直接 匿名内部子类,示例 如下:
enum Color {
		R(0xff0000) {
			@Override
			public int r() {
				return 0x00ffff;
			}

			public void f() {}
		},
		G(0x00ff00), 
		B(0x0000ff);

		private int value;

		Color(int value) {
			this.value = value;
		}

		public int getValue() {
			return value;
		}

		public int r() {
			return 0xFFFFFF ^ this.value;
		}
	}
0 请登录后投票
   发表时间:2011-12-29  

 

 

奇葩 Java 代码片段

 

0 请登录后投票
   发表时间:2011-12-29  
smallgaogao1 写道
Integer[] a = new Integer[]{1};
int[] b = new int[]{1};
testOverloading(a);
testOverloading(b); 可以调用


public static int sum(List<Integer> ints) { 
 
        return 0; 


public static String sum(List<String> strings) { 
      return ""; 


两个方法不能同时存在

再详细说下吧,可能我的说法有误。
数组形式确实是可以调用的。
但按道理说,下面的代码同样可以调用,但实际却不能。
testOverloading(1, 2);
testOverloading(new Integer(1), new Integer(2));


而下面这两个方法,是可以编译通过的。你可以试试用javac编译器(Eclipse的ECJ编译器可能会拒绝编译这段代码)
public static int sum(List<Integer> ints) { 
 
        return 0; 


public static String sum(List<String> strings) { 
      return ""; 

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics