- 浏览: 3049422 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
先看看Java语言规范第三版里方法调用表达式的语法规定:
注意到NonWildTypeArguments出现的话前面必然有“点”。这意味着什么呢?
举例:把Arrays.asList静态引入进来:
由于没有传任何参数给asList()方法,所以原本声明为:
就无从让编译器去推导泛型参数T的类型应该是什么。因而编译上面的Demo会得到一个警告:
好吧,那么把泛型参数加上,变成这样:
再扔给javac编译,它就闹别扭了:
根据Java语言规范的规定,要加上这个泛型参数,我们只能:
注意到了么,要有“点”。
这样的语法设计倒是避开了FGAB问题,只不过结果既没有保持语法的一致性又不美观。叹气。
貌似是因为评论也可以用来发广告所以现在评论也要做NC小测验了 = =
MethodInvocation: MethodName ( ArgumentListopt ) Primary . NonWildTypeArgumentsopt Identifier ( ArgumentListopt ) super . NonWildTypeArgumentsopt Identifier ( ArgumentListopt ) ClassName . super . NonWildTypeArgumentsopt Identifier ( ArgumentListopt ) TypeName . NonWildTypeArguments Identifier ( ArgumentListopt )
注意到NonWildTypeArguments出现的话前面必然有“点”。这意味着什么呢?
举例:把Arrays.asList静态引入进来:
import static java.util.Arrays.asList; public class Demo { public static void main(String[] args) { asList(); } }
由于没有传任何参数给asList()方法,所以原本声明为:
public static <T> List<T> asList(T... a)
就无从让编译器去推导泛型参数T的类型应该是什么。因而编译上面的Demo会得到一个警告:
javac 写道
注意:Demo.java 使用了未经检查或不安全的操作。
注意:要了解详细信息,请使用 -Xlint:unchecked 重新编译。
注意:要了解详细信息,请使用 -Xlint:unchecked 重新编译。
好吧,那么把泛型参数加上,变成这样:
import static java.util.Arrays.asList; public class Demo { public static void main(String[] args) { <String>asList(); // error } }
再扔给javac编译,它就闹别扭了:
javac 写道
Demo.java:5: 非法的表达式开始
<String>asList();
^
Demo.java:5: 非法的表达式开始
<String>asList();
^
Demo.java:5: 不是语句
<String>asList();
^
3 错误
<String>asList();
^
Demo.java:5: 非法的表达式开始
<String>asList();
^
Demo.java:5: 不是语句
<String>asList();
^
3 错误
根据Java语言规范的规定,要加上这个泛型参数,我们只能:
import java.util.Arrays; public class Demo { public static void main(String[] args) { Arrays.<String>asList(); } }
注意到了么,要有“点”。
这样的语法设计倒是避开了FGAB问题,只不过结果既没有保持语法的一致性又不美观。叹气。
评论
6 楼
maoyingsteel
2015-08-20
5 楼
zking3
2014-07-23
在调用泛型方法时遇到问题,大侠帮助看看:
首先 你的代码在执行的时候 全部都会被擦出泛型,
然后你装入的key和value都是String,然后取出时又是按照泛型强转而取,
建议反编译下试试。
首先 你的代码在执行的时候 全部都会被擦出泛型,
然后你装入的key和value都是String,然后取出时又是按照泛型强转而取,
建议反编译下试试。
4 楼
793059909
2014-06-24
在调用泛型方法时遇到问题,大侠帮助看看:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at generics.snippet.GenericsMapInstance.main(GenericsMapInstance.java:15)
package generics.snippet; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; public class GenericsMapInstance { public static void main(String[] args) { String test = "key1:1k;key2:2;key:3"; Map<String, Integer> map =GenericsMapInstance.<String, Integer>getMap(test, ";", ":"); for (Entry<String, Integer> entry : map.entrySet()) { Integer value = entry.getValue(); } } public static <K, V> Map<K, V> getMap(String source, String firstSplit, String secondSplit) { Map<K, V> result = new HashMap<K, V>(); if (source.equals("")) { return result; } String[] strings = source.split(firstSplit); for (int i = 0; i < strings.length; i++) { String[] tmp = strings[i].split(secondSplit); if (tmp.length == 2) { result.put((K) tmp[0], (V) tmp[1]); // System.out.println("(K) tmp[0]:"+((K) tmp[0]).getClass()); // System.out.println("(V) tmp[1]:"+((V) tmp[1]).getClass()); } } return result; } }
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at generics.snippet.GenericsMapInstance.main(GenericsMapInstance.java:15)
3 楼
RednaxelaFX
2010-09-08
imniortal 写道
评论还有测验?
貌似是因为评论也可以用来发广告所以现在评论也要做NC小测验了 = =
2 楼
imniortal
2010-09-08
评论还有测验?
1 楼
IndigoDai
2010-04-04
你速度真快啊。
//汗…… 要想在JavaEye上评论,还得做个小测验,好不容易考过去。
//汗…… 要想在JavaEye上评论,还得做个小测验,好不容易考过去。
发表评论
-
The Prehistory of Java, HotSpot and Train
2014-06-02 08:18 0http://cs.gmu.edu/cne/itcore/vi ... -
MSJVM and Sun 1.0.x/1.1.x
2014-05-20 18:50 0当年的survey paper: http://www.sym ... -
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
class data sharing by Apple
2014-03-28 05:17 0class data sharing is implement ... -
Java 8与静态工具类
2014-03-19 08:43 16278以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10453先看看下面这个代码例子, interface IFoo { ... -
HotSpot Server VM与Server Class Machine
2014-02-18 13:21 0HotSpot VM历来有Client VM与Server V ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
GC stack map与deopt stack map的异同
2014-01-08 09:56 0两者之间不并存在包含关系。它们有交集,但也各自有特别的地方。 ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22396(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对C语义的for循环的基本代码生成模式
2013-10-19 23:12 21874之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ... -
oop、klass、handle的关系
2013-07-30 17:34 0oopDesc及其子类的实例 oop : oopDesc* ... -
Nashorn各种笔记
2013-07-15 17:03 0http://bits.netbeans.org/netbea ... -
《深入理解Java虚拟机(第二版)》书评
2013-07-08 19:19 0值得推荐的中文Java虚拟机入门书 感谢作者赠与的样书,以下 ... -
豆列:从表到里学习JVM实现
2013-06-13 14:13 48368刚写了个学习JVM用的豆列跟大家分享。 豆列地址:http: ...
相关推荐
下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法,这些类型参数可以在方法声明时指定,并在方法体内部使用。与类的泛型类似,它们提供了编译时...
这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...
Java 泛型可以看作是一种便捷语法,能够节省类型转换(casting)的操作。例如,以下代码: List<Apple> box = ...; Apple apple = box.get(0); 通过使用泛型,我们可以避免类型转换,并提高代码的可读性和可维护性...
Java泛型是Java编程语言中的一个强大特性,它允许我们在定义类、接口和方法时指定类型参数,从而实现代码的重用和类型安全。在Java泛型应用实例中,我们可以看到泛型如何帮助我们提高代码的灵活性和效率,减少运行时...
Java泛型的用法及T.class的获取过程解析 Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析...
Java泛型机制详解 Java泛型是Java语言中的一种机制,用于在编译期检查类型安全。Java泛型的出现解决了Java早期版本中类型安全检查的缺陷。Java泛型的好处是可以在编译期检查类型安全,避免了运行时的...
Java泛型(Generics)是一种在编译时确保类型安全的机制,它允许程序员编写类型安全的通用类或方法,而无需进行显式的类型转换。在Java 1.5引入泛型之前,集合类(如`ArrayList`)只能存储`Object`类型的元素。这...
Java 泛型是一种强大的工具,它允许我们在编程时指定变量的类型,提供了编译时的类型安全。然而,Java 的泛型在运行时是被擦除的,这意味着在运行时刻,所有的泛型类型信息都会丢失,无法直接用来创建对象或进行类型...
Java泛型是Java编程语言中的一个关键特性,它在2004年随着Java SE 5.0的发布而引入,极大地增强了代码的类型安全性和重用性。本篇文章将深入探讨Java泛型的发展历程、核心概念以及其在实际开发中的应用。 1. **发展...
综上所述,Java泛型接口提供了强大的类型安全性,允许我们在接口中定义通用的方法,并在实现时指定具体的类型。通过类型参数约束、通配符、类型擦除和类型推断等机制,我们可以灵活地设计和使用泛型接口,提高代码的...
在Java编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率,因为编译器可以在编译时检查类型,避免了运行时...
1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1....
在探讨`IEnumerator`泛型函数调用方法之前,我们首先需要理解`IEnumerator`接口以及它在C#中的作用,尤其是在Unity游戏开发环境中的应用。接着,我们将深入分析如何正确地使用`IEnumerator`来实现协程(coroutine)...
在本文中,我们将详细介绍 Java 泛型的使用方法和实现原理。 一、泛型的简介 泛型是 Java 5 中引入的一种语言特性,旨在解决类型安全问题。在 Java 中,泛型可以应用于集合、类、接口和方法中。泛型的主要目的是...
Java泛型是Java编程语言中的一个强大特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。这使得代码更加安全、可读性更强,并且能够减少类型转换的必要。在“java泛型的内部原理及更深应用”这个...