泛型方法与类型推断

一。好处

1.代替整个类泛型化

2.static方法无法访问泛型类的类型参数,所以static方法需要使用泛型能力,就必须使其成为泛型方法。

二。示例

只需将泛型参数列表置于返回值之前。

public class GenericMethods {
  public void f(T x) {
     System.out.println(x.getClass().getName());
 }
  public static void main(String[] args) {
    GenericMethods gm = new GenericMethods();
    gm.f("");
    gm.f(1);
    gm.f(1.0F);
    gm.f(gm);
  }
}

结果:好像f()方法被无限重载过一样。

java.lang.String
java.lang.Integer
java.lang.Float
GenericMethods

三。泛型与反射

public <T> T getInstance(Class<T> clazz) throws InstantiationException, IllegalAccessException{
        return clazz.newInstance();
    }

调用示例

getInstance(Class.forName("com.gl.User"));

forName

public static Class<?> forName(String className)
                        throws ClassNotFoundException

四。API示例

java.util.Arrays

public static <T> List<T> asList(T... a)

1.用法

1 //  List<Shape> shapes = Arrays.asList(new Rect(),new Square());//编译期出错。 数组与泛型容器的区别:数组有协变类型,而泛型容器没有内建协变类型
2     List<Rect> rects = Arrays.asList(new Rect(),new Square());
3     List<Shape> rects1 = Arrays.<Shape>asList(new Rect(),new Square()); //显示类型参数说明
4
5     List<Rect> rects2 = new ArrayList<Rect>();
6     Collections.addAll(rects2, new Rect(),new Square());

类继承

class Shape{
    void draw(){
        System.out.println(this+".draw()");
    }
}

class Circle extends Shape{
    @Override
    public String toString() {
        return "Circle";
    }
}
class Rect extends Shape{
    @Override
    public String toString() {
        return "Rect";
    }
}

class Triangle extends Shape{
    @Override
    public String toString() {
        return "Triangle";
    }
}

class Square extends Rect{
    @Override
    public String toString() {
        return "Square";
    }
}

泛型方法与类型推断

时间: 2024-10-29 17:19:21

泛型方法与类型推断的相关文章

41_自定义泛型方法的练习与类型推断总结

编写一个泛型方法,自动将Object类型的对象转换成其他类型. //编写一个泛型方法,自动将Object类型的对象转换成其他类型.      private static <T> T autoConvert(Object obj){ return (T)obj; } 定义一个方法,可以将任意类型的数组中的所有元素填充为相应类型的某个对象. //定义一个方法,可以将任意类型的数组中的所有元素填充内容为相应类型的某个对象 private static <T> void fillArra

类型参数的类型推断

类型参数的类型推断(花了张老师两天的时间总结) l 编译器判断范型方法的实际类型参数的过程称为类型推断,类型推断是相对于知觉推断的,其实现方法是一种非常复杂的过程. l 根据调用泛型方法时实际传递的参数类型或返回值的类型来推断,具体规则如下: 1.当某个类型变量只在整个参数列表中的所有参数和返回值中的一处被应用了,那么根据调用方法时该处的实际应用类型来确定,这很容易凭着感觉推断出来,即直接根据调用方法时传递的参数类型或返回值来决定泛型参数的类型,例如: swap(new String[3],3,

泛型中的类型约束和类型推断

前一篇文章介绍了泛型的基本概念.在本文中,我们看一下泛型中两个很重要的特性:类型约束和类型推断. 类型约束 相信你还记得前面一篇文章中的泛型方法,在这个泛型方法中,我们就使用了类型约束. 类型约束(type constraint)进一步控制了可指定的类型实参,当我们创建自己的泛型类型或者泛型方法的时候,类型约束是很有用的. 回到前一篇例子中的泛型方法,这个泛型方法就要求可指定的类型实参必须实现了IComparable接口. 为什么会有这个约束呢?原因很简单,因为我们在泛型方法的实现中直接调用T类

6.6 类型推断

我们曾经讨论过值的类型推断,知道在 C# 3.0 中用 var 关键字,在 F#中用 let 绑定.从本节开始,我们将讨论由 C# 和 F# 共有的另一个方面,当在 C# 中调用泛型方法时,如 Option.Some(清单 5.9)或 Option.Map(清单 6.13),可以显式指定类型参数值,像这样: var dt = Option.Some<DateTime>(DateTime.Now); var nt = dt.Map<DateTime, int>(d=> d.Ye

scala学习手记17 - 容器和类型推断

关于scala的类型推断前面已经提到过多次.再来看一下下面这个例子: import java.util._ var list1: List[Int] = new ArrayList[Int] var list2 = new ArrayList[Int] list2 add 1 list2 add 2 var total = 0 for (index <- 0 until list2.size()) { total += list2.get(index) } println("Total i

scala学习手记20 - 方法返回类型推断

除了推演变量的类型,scala也会推演方法的返回类型.不过这里有一处需要注意:方法返回类型的推演依赖于方法的定义方式.如果用等号"="定义方法,scala就会推演方法返回类型:否则,它就认为方法的返回为void.看一个例子: def printMethodInfo(methodName: String) { println("The return type of " + methodName + " is " + getClass().getDe

[原创]Scala学习:关于变量(val,var,类型推断)

1.常量定义:  val val 类似于java中的final变量.一旦初始化了,val就不能再被赋值 val megs = "hello world" 2.变量的定义: var var 如同java里面的非final变量,可以在它的声明周期内多次被赋值 var spark:String = " i am big data " var spark: String = " i am" 解释器中支持table键 补充和提示 3.变量类型推断: 当分配

[Effective Modern C++] Item 1. Understand template type deduction - 了解模板类型推断

条款一 了解模板类型推断 基本情况 首先定义函数模板和函数调用的形式如下,在编译期间,编译器推断T和ParamType的类型,两者基本不相同,因为ParamType常常包含const.引用等修饰符 template<typename T> void f(ParamType param); // 函数模板形式 f(expr); // 函数调用 存在T的类型即为expr类型的情况,如下T为int templat<typename T> void f(const T& param

C++11新特性:自动类型推断和类型获取

声明:本文是在Alex Allain的文章http://www.cprogramming.com/c++11/c++11-auto-decltype-return-value-after-function.html的基础上写成的. 加入了很多个人的理解,不是翻译. 转载请注明出处 http://blog.csdn.net/srzhz/article/details/7934483 自动类型推断 当编译器能够在一个变量的声明时候就推断出它的类型,那么你就能够用auto关键字来作为他们的类型: [c