Android谈起泛型,大家都很佛性

说起泛型,不用想,肯定都是用的佛性,可用可不用四舍五入下就是不用。可现实是,你不用,我不用,可总有“别人家的孩子”在用,你说气不气。

为何有了接口,我们还需要使用泛型呢?因为即便使用了接口,对于程序的约束还是太强。因为一旦指明了接口,就会要求我们的代码使用特定的接口,而我们的目的是希望编写出更通用的代码,是要使代码能够应用于某种不确定的类型,而不是一个具体的接口或类。

这是《Java编程思想》说的,可不是我吹的,香不香看了才知道。本文主要涉及下面几个方面的介绍:

泛型类

泛型的目的是用来指定要持有什么类型的对象,而由编译器来保证类型的正确性。使用泛型参数 T,用尖括号括住,放在类后。

public class Tested<T> {
    private T t;

    public void set(T t) {
        this.t = t;
    }

    public T get() {
        return t;
    }
}

现有测试类Test1th :

public class Test1th { }

需要Tested持有什么类型的对象,将其放在尖括号内即可。泛型与多态不冲突,所以我们也可以使用其子类。

    public void startTest() {
        Tested<Test1th> test = new Tested<>();
        test.set(new Test1th());
        Test1th td = test.get();
    }

很简单吧,如果我们需要Tested 持有多个对象呢?来看栗子:

public class Tested<A, B> {
    private A a;
    private B b;

    public void set(A a, B b) {
        this.a = a;
        this.b = b;
    }

    public A getA() {
        return a;
    }

    public B getB() {
        return b;
    }
}

新增测试类Test2th:

public class Test2th { }

在使用时,为A、B 指定类型。当然Tested<A, B> 也支持继承,可以通过Test2ed<A, B, C> extend Tested<A, B>来进行扩展。

    public void startTest() {
        Tested<Test1th, Test2th> test = new Tested<>();
        test.set(new Test1th(), new Test2th());
        Test1th tdA = test.getA();
        Test2th tdB = test.getB();
    }

泛型接口

泛型也可应用于接口。泛型接口与泛型类在使用上相同。这里就拿常见的泛型接口 Iterable< T> 来举例吧,来让Tested<A, B> 具有简单迭代功能。注意在使用泛型接口时,要指定泛型接口的泛型参数类型。其中TestBase见下:

public class TestBase { }

栗子Tested<A, B>见下,也许你也注意到了Iterator< TestBase>,这说明泛型也是可以应用到匿名内部类之上的。

public class Tested<A, B> implements Iterable<TestBase> {
    private A a;
    private B b;

    public Tested(A a, B b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public Iterator<TestBase> iterator() {
        return new Iterator<TestBase>() {
            @Override
            public boolean hasNext() {
                return a != null || b != null;
            }

            @Override
            public TestBase next() {
                TestBase tb = null;
                if (a instanceof TestBase) {
                    tb = (TestBase) a;
                    a = null;
                } else if (b instanceof TestBase) {
                    tb 
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Android开发中,如果想将泛型作为字符串打印出来,可以使用Java中的反射机制来实现。以下是一种可能的实现方式。 1. 首先,定义一个泛型类或方法,例如: ```java public class GenericClass<T> { // ... // 定义一些泛型方法或成员变量 // ... } ``` 2. 在Android中,使用反射机制获取泛型的类型,并将其转换为字符串。可以使用如下代码: ```java GenericClass<Integer> genericClass = new GenericClass<>(); Type genericType = genericClass.getClass().getGenericSuperclass(); if (genericType instanceof ParameterizedType) { ParameterizedType parameterizedType = (ParameterizedType) genericType; Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); for (Type type : actualTypeArguments) { String typeName = type.toString(); Log.d(TAG, "泛型类型:" + typeName); } } ``` 上述代码中,首先创建一个泛型对象`genericClass`,然后通过`getClass()`获取Class对象,接着使用`getGenericSuperclass()`获取泛型的类型`genericType`。 3. 判断泛型类型是否是参数化类型`ParameterizedType`,如果是,通过调用`getActualTypeArguments()`方法获取泛型参数类型,并将其转换为字符串,最后通过`Log.d()`或其他方式打印出来。 需要注意的是,以上代码仅适用于泛型类,如果要适用于泛型方法,可以使用`Method`类中的`getGenericReturnType()`等方法获取相关信息。 总结:通过以上步骤,我们可以将Android中的泛型作为字符串打印出来,并在开发过程中对其进行调试和分析。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值