实例183 - 自定义非泛型栈结构

本文通过一个不使用泛型的栈实现案例,说明了在Java编程中不使用泛型可能导致的类型转换错误和缺乏类型安全等问题,并展示了如何在运行时出现错误。

心法领悟183:不用泛型的问题。

  1. 为了获取适当的值,必须进行强制类型转换。因为在保存数据时使用了Object类型的数组,丢失了对象的实际类型。
  2. 第二,没有进行错误检查。这意味着可以向该栈中存入任何类型的对象,如InputStream等。当转换成String时会在系统运行时报错。
package com.mingrisoft.generic;

public class Stack {
    private Object[] container = new Object[10];
    private int index = 0;
    
    public void push(Object o) {
        if (index != container.length) {
            container[index++] = o;
        }
    }
    
    public Object pop() {
        if (index != -1) {
            return container[--index];
        }
        return null;
    }
    
    public boolean empty() {
        if (index == 0) {
            return true;
        } else {
            return false;
        }
    }
}

 

package com.mingrisoft.generic;

public class StackTest {
    public static void main(String[] args) {
        Stack stack = new Stack();
        System.out.println("向栈中增加字符串:");
        System.out.println("视频学Java");
        System.out.println("细说Java");
        System.out.println("Java从入门到精通(第2版)");
        stack.push("视频学Java");
        stack.push("细说Java");
        stack.push("Java从入门到精通(第2版)");
        System.out.println("从栈中取出字符串:");
        while (!stack.empty()) {
            System.out.println((String) stack.pop());
        }
    }
}

 运行结果:

向栈中增加字符串:
视频学Java
细说Java
Java从入门到精通(第2版)
从栈中取出字符串:
Java从入门到精通(第2版)
细说Java
视频学Java

 

### C# 泛型概述 C# 泛型提供了一种机制,在定义方法、类、接口时不涉及具体的类型,而是在使用时再指定实际的数据类型。这不仅提高了代码的灵活性和重用性,还增强了类型安全性并优化了性能[^1]。 #### 泛型的优势 利用泛型技术能够实现最大化的代码复用度、保持类型安全性和提升执行效率。借助于.NET框架提供的`System.Collections.Generic`命名空间下的多个内置泛型集合类,开发者可以直接采用这些高效且类型安全的数据结构来代替旧版非泛型版本[^2]。 #### 创建自定义泛型组件 除了使用现成的泛型集合外,还可以构建属于自己的泛型接口、类、方法等。下面是一个简单的(Stack)实现例子: ```csharp class MyStack<T> { private List<T> items; public MyStack() { items = new List<T>(); } public void Push(T item) { items.Add(item); } } ``` 此段代码展示了如何声明一个带有单个类型参数`<T>`的泛型类,并在其内部操作该类型的实例。这里选择了更灵活的`List<T>`作为存储容器而不是数组,以便更好地管理动态增长的需求[^4]。 #### 类型约束的应用 为了使泛型更加实用,有时需要对允许传入的具体类型加以限制。例如,当希望某个泛型函数仅能接收实现了特定接口的对象时,则可以通过添加where子句来进行限定: ```csharp public class ExampleClass<T> where T : IComparable, IDisposable { // Class implementation... } ``` 上述语法表示只有那些既继承了IDisposable又实现了IComparable接口的类型才可以被当作`ExampleClass<>`的实际参数传递给定界符内的位置。 #### 泛型委托简介 另外值得一提的是泛型委托——一种结合了泛型特性的委托形式。它们允许我们像对待常规方法那样处理具有不同签名的动作或行为模式。比如定义如下所示的一个简单事件处理器模板: ```csharp public delegate TResult Func<in T, out TResult>(T arg); // 或者用于无返回值的情况 public delegate void Action<in T>(T obj); ``` 这里的关键词`in` 和 `out`分别指定了输入/输出方向上的协变特性支持[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值