`
RednaxelaFX
  • 浏览: 3049422 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

Java的泛型方法调用语法真是……诶

    博客分类:
  • Java
阅读更多
先看看Java语言规范第三版方法调用表达式的语法规定
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 重新编译。


好吧,那么把泛型参数加上,变成这样:
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 错误


根据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,然后取出时又是按照泛型强转而取,
建议反编译下试试。
4 楼 793059909 2014-06-24  
在调用泛型方法时遇到问题,大侠帮助看看:

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上评论,还得做个小测验,好不容易考过去。

相关推荐

    java 泛型方法使用示例

    下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法,这些类型参数可以在方法声明时指定,并在方法体内部使用。与类的泛型类似,它们提供了编译时...

    JAVA泛型加减乘除

    这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...

    Java泛型三篇文章,让你彻底理解泛型(super ,extend等区别)

    Java 泛型可以看作是一种便捷语法,能够节省类型转换(casting)的操作。例如,以下代码: List&lt;Apple&gt; box = ...; Apple apple = box.get(0); 通过使用泛型,我们可以避免类型转换,并提高代码的可读性和可维护性...

    Java泛型应用实例

    Java泛型是Java编程语言中的一个强大特性,它允许我们在定义类、接口和方法时指定类型参数,从而实现代码的重用和类型安全。在Java泛型应用实例中,我们可以看到泛型如何帮助我们提高代码的灵活性和效率,减少运行时...

    Java泛型的用法及T.class的获取过程解析

    Java泛型的用法及T.class的获取过程解析 Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析...

    很好的Java泛型的总结

    Java泛型机制详解 Java泛型是Java语言中的一种机制,用于在编译期检查类型安全。Java泛型的出现解决了Java早期版本中类型安全检查的缺陷。Java泛型的好处是可以在编译期检查类型安全,避免了运行时的...

    面试必须资料java泛型攻略、

    Java泛型(Generics)是一种在编译时确保类型安全的机制,它允许程序员编写类型安全的通用类或方法,而无需进行显式的类型转换。在Java 1.5引入泛型之前,集合类(如`ArrayList`)只能存储`Object`类型的元素。这...

    Java 泛型擦除后的三种补救方法

    Java 泛型是一种强大的工具,它允许我们在编程时指定变量的类型,提供了编译时的类型安全。然而,Java 的泛型在运行时是被擦除的,这意味着在运行时刻,所有的泛型类型信息都会丢失,无法直接用来创建对象或进行类型...

    java泛型技术之发展

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着Java SE 5.0的发布而引入,极大地增强了代码的类型安全性和重用性。本篇文章将深入探讨Java泛型的发展历程、核心概念以及其在实际开发中的应用。 1. **发展...

    java 泛型接口示例

    综上所述,Java泛型接口提供了强大的类型安全性,允许我们在接口中定义通用的方法,并在实现时指定具体的类型。通过类型参数约束、通配符、类型擦除和类型推断等机制,我们可以灵活地设计和使用泛型接口,提高代码的...

    java 泛型类的类型识别示例

    在Java编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率,因为编译器可以在编译时检查类型,避免了运行时...

    1.java泛型定义.zip

    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`泛型函数调用方法之前,我们首先需要理解`IEnumerator`接口以及它在C#中的作用,尤其是在Unity游戏开发环境中的应用。接着,我们将深入分析如何正确地使用`IEnumerator`来实现协程(coroutine)...

    Java泛型使用详细分析.pdf

    在本文中,我们将详细介绍 Java 泛型的使用方法和实现原理。 一、泛型的简介 泛型是 Java 5 中引入的一种语言特性,旨在解决类型安全问题。在 Java 中,泛型可以应用于集合、类、接口和方法中。泛型的主要目的是...

    java泛型的内部原理及更深应用

    Java泛型是Java编程语言中的一个强大特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。这使得代码更加安全、可读性更强,并且能够减少类型转换的必要。在“java泛型的内部原理及更深应用”这个...

Global site tag (gtag.js) - Google Analytics