Java中的泛型机制简介(含义,钻石表达式,自定义泛型))

Java中的泛型机制简介(含义,钻石表达式,自定义泛型))

泛型是java5之后加入的一个重要的特性。本文对泛型进行一个简单的介绍。

从集合的角度分析泛型的含义

泛型本质含义其实是对类型参数化。所谓类型参数化直白一点解释就是,传入的参数的类型不确定,除了形参变量名用标识符来表示,类型名同样用标识符来表示,可以理解为类型也是一个变量。

这里借助集合来对泛型进行理解。

List list1 = new ArrayList();
        list1.add("abc");
        list1.add(123);
        list1.add(true);

这是普通的集合,可以看到,集合中可以添加字符串,整形,布尔型等多种类型(严格来说是所有的类型,包括基本数据类型和引用数据类型)。

那如果想让集合中只存储一种元素呢?

这就使用到了泛型机制。

它的写法是这样的:

List<String> list2 = new ArrayList<String>();
        list2.add("acx");
        list2.add("1-1-1");

它的写法就是在类名后面写尖括号<>,<>里面写上传入的类型名,构造方法中也是这样。

如果像这样使用了泛型,再在集合中存储其他类型就会报错。
比如:
报错
第三行报错了,因为指定了集合中只能存储字符串类型。

钻石表达式

在Java7之后引入了类型自动推断机制,上面写过的这行代码:

List<String> list2 = new ArrayList<String>();

可以简化成:

List<String> list2 = new ArrayList<>();

构造方法后的<>内省略类型名,因为这个符号长得像钻石,故得名钻石表达式

自定义泛型

在自己写的 或者 接口 里面也可以指定泛型。
这里先看一下Java中List集合源码是如何指定泛型的:

public interface List<E> extends Collection<E> {}

可以看到定义泛型就是在类名或接口名后写上<>,<>里面写一个标识符,标识符可以随便写,List集合后面写的是 E ,E 是element的首字母。

java源代码中经常出现的是:E 和 T
E是Element单词首字母。
T是Type单词首字母。

看一下 List 集合中的add()的源码:

boolean add(E e);

这个方法的意思就是传入一个E类型的对象 e。

所以自定义泛型也按这个套路来就可以了,给一个例子:

public class GenericTest02<T> {
    public void whatAmI(T o){
        System.out.println("I am a "+o);
    }

    public static void main(String[] args) {
        GenericTest02<Cat> instance = new GenericTest02<>();
        instance.whatAmI(new Cat());
    }
}

class Cat{
}

运行结果

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java,获取lambda达式是不直接支持的。Lambda达式在编译时被转换为函数式接口的实例,而函数式接口可能会定义一个或多个参数。 在Java,我们不能直接获取lambda达式,因为被擦除了(type erasure)。在运行时,信息是不可用的。Lambda达式只能通过函数式接口定义的方法来访问参数和返回类。 然而,可以通过一些间接的方式来获取lambda达式。例如,可以使用反射来获取函数式接口的类信息,并进一步获取参数的类。以下是一个示例: ```java import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class Main { public static void main(String[] args) { MyInterface<String> myObj = s -> System.out.println(s); Type type = myObj.getClass().getGenericInterfaces()[0]; if (type instanceof ParameterizedType) { ParameterizedType parameterizedType = (ParameterizedType) type; Type[] typeArguments = parameterizedType.getActualTypeArguments(); for (Type typeArgument : typeArguments) { System.out.println(typeArgument); } } } } interface MyInterface<T> { void doSomething(T t); } ``` 在上述示例,我们创建了一个使用String类的lambda达式,并使用反射来获取该lambda达式实现的函数式接口的。需要注意的是,这种方式只适用于已知函数式接口的情况,并且只能获取参数的类,无法获取具体的类参数。 总结起来,虽然在Java不能直接获取lambda达式,但可以通过反射间接获取函数式接口的信息。然而,这种方式的适用范围有限,并且可能会增加代码的复杂性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值