`
racingbird
  • 浏览: 23344 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

泛型[创建类型实例]

 
阅读更多

public Class Erased<T>{
	private final int SIZE = 100;
	public static void f(Object arg){
		if(arg instanceof T){}	//	Error
		T var = new T();		// Error
		T[] array = new T[SIZE];	// Error
		T[] array = (T)new Object[SIZE];	// Unchecked warning
	}
}

 

Erased.java 中创建类型实例无法实现,部分原因是因为擦除,而另一部分 原因是因为编译器不能验证T具有默认(无参)构造器。 Java中的解决方案是传递一个工厂对象,并使用它来创建新的实例。最便利的 工厂对象就是Class对象, 因此如果使用类型标签,就可以使用newInstance() 来创建这个类型的新对象


class ClassAsFactory<T>
{
	T x;
	public ClassAsFactory(Class<T> kind){
		try{
			x = kind.newInstance():
		}catch(Exception e){
			...	
		}
	}
}

class Employee{}

public class InstantiateGenericType
{
	public static void main(String[] args){
		ClassAsFactory<Employee> fe = 
			new ClassAsFactory<Employee>(Employee.class);

		try{
			ClassAsFactory<Integer> f1 = 
				new ClassAsFactory<Integer>(Integer.class);
		}catch(Exception e){
			...
		}
	}
}
 
可以编译,但是会因为ClassAsFactory<Integer>而失败,因为Integer没有任何 默认的构造器。 因为这个错误不是在编译期捕获的,所以不赞成,建议使用显式 的工厂,并将限制其类型,使得只能接受实现了这个工厂的类。


interface Factory1<T>
{
	T create();
}

class Foo2<T>
{
	private T x;
	public <F extends Factory1<T>> Foo2(F factory){
		x = factory.create();
	}
}

class IntegerFactory implements Factory1<Integer>
{
	public Integer create(){
		return new Integer(0);
	}
}
class Widget
{
	public static class Factory implements Factory1<Widget>
	{
		public Widget create(){
			return new Widget();
		}
	}
}

public class FactoryConstrain
{
	public static void main(String[] args){
		new Foo2<Integer>(new IntegerFactory());
		new Foo2<Widget>(new Widget.Factory())
	}
}
 
这只是传递Class<T>的一种变体, 2种方式都传递了工厂对象, Class<T>碰巧是
内建的工厂对象,而上面的方式创建了一个显式的工厂对象,但却获得了编译器检查。

另一个种方式是模板方法法设计模式,get()是模板方法,而create()是在子类
中定义的,用来产生子类类型的对象。

abstract class GenericWithCreate<T>
{
	final T element;
	GenericWithCreate(){
		element = create();
	}
	abstract T create();
}

class X{}

class Creator extends GenericWithCreate<X>
{
	x create(){
		return new X();
	}
	void f(){
		sysout(element.getClass().getSimpleName());
	}
}

public class CreatorGeneric
{
	public static void main(String[] args){
		Creator c = new Creator();
		c.f();
	}
}
 


分享到:
评论

相关推荐

    C#泛型类、泛型方法、泛型接口、泛型委托的实例

    类型参数是在定义类时使用的占位符,实际的类型在创建类的实例时指定。例如,我们可以创建一个名为`GenericContainer&lt;T&gt;`的泛型类,其中`T`就是类型参数。这个类可以存储任何类型的对象,但具体类型在实例化时确定。...

    C#泛型集合使用实例

    在C#编程语言中,泛型集合是一种强大的工具,它允许开发者创建类型安全的数据结构,无需显式地指定存储的数据类型。泛型集合提供了一种高效且灵活的方式来处理各种类型的数据,同时保持了编译时的类型检查。下面将...

    很强大的泛型委托实例

    通过实际的代码示例,我们可以看到如何创建、实例化和使用泛型委托,以及它们如何帮助我们编写更简洁、更具可维护性的代码。 在“泛型委托”这个压缩包文件中,可能包含了以下内容: 1. **定义泛型委托**:首先,...

    泛型编程小实例(以List为例)

    泛型(Generics)是一种在编程中引入的模板机制,用于在定义数据结构或方法时创建类型参数。这些参数可以在实例化时替换为具体的类型,使得容器(如List、Set、Map等)能够存储特定类型的元素,而不是任意类型。...

    c# 泛型应用实例

    10. **泛型与反射**:通过反射,我们可以动态地创建泛型类型实例,获取和设置泛型类型字段,调用泛型方法等。这对于构建元编程和动态代码生成的场景非常有用。 总的来说,C#泛型的应用实例非常广泛,从简单的数据...

    C#泛型、反射实例、自动生成sql语句

    例如,我们可以通过类型名称获取类型实例,然后调用其公共方法: ```csharp Type type = Type.GetType("System.IO.File"); MethodInfo method = type.GetMethod("WriteAllText"); method.Invoke(null, new object[]...

    vs2008 泛型 的使用 实例

    在Visual Studio 2008(VS2008)中,开发者可以充分利用泛型来创建和使用数据结构,而无需担心类型转换带来的潜在错误。本文将详细探讨泛型的概念、优点以及如何在VS2008中使用泛型集合。 首先,我们需要理解什么是...

    C++f 泛型编程应用实例

    C++泛型编程是C++语言中的一个重要特性,它允许开发者编写不依赖特定类型而具有通用性的代码。这种编程范式极大地提高了代码的重用性和灵活性,降低了维护成本。本篇将深入探讨C++泛型编程的应用实例,帮助初学者...

    ASP.NET 的泛型实例

    4. 介绍泛型集合List,并创建一个实例,指定具体的数据类型。 5. 演示如何在List中添加、删除和访问元素,展示其类型安全和性能优势。 6. 对比ArrayList和List在内存使用和性能上的差异,解释为何在ASP.NET开发中...

    Java泛型应用实例

    在Java泛型应用实例中,我们可以看到泛型如何帮助我们提高代码的灵活性和效率,减少运行时的类型检查和强制转换。 首先,让我们理解泛型的基本概念。泛型主要由两部分组成:类型参数和类型边界。类型参数是在类或...

    SSH泛型代码实例

    - **ActionSupport**:Struts2的ActionSupport基类并不直接使用泛型,但开发者可以创建自己的泛型Action,用于指定返回值类型,增强代码可读性和类型安全性。 - **结果映射**:在配置Struts2的Result类型时,可以...

    c#创建线程匿名泛型委托的实例.zip

    本文将详细讲解如何使用C#创建线程、匿名委托以及泛型委托,并通过实例来阐述这些概念。 首先,让我们理解什么是线程。在多任务操作系统中,线程是程序执行的基本单元,它允许程序同时执行多个任务。在C#中,我们...

    Java泛型实例

    当我们创建`GenericStack`的实例时,可以指定具体的类型,如`GenericStack&lt;Integer&gt;`或`GenericStack&lt;String&gt;`。 接下来,我们讨论泛型接口。泛型接口与泛型类相似,只是它们定义在接口中。例如,我们可以定义一个...

    java 泛型入门 实例

    - 类型擦除会导致一些限制,比如不能创建泛型数组,因为数组的类型在运行时是确定的。 5. **泛型与集合** - 泛型主要应用于集合框架,如`List`, `Set`, `Map`等。使用泛型可以确保添加到集合中的元素类型与集合...

    Delphi 泛型 接口约束的实例

    在实例文件中,你可能还会看到如何在实际代码中使用这个泛型类,例如创建实例并调用它的方法,以及验证泛型类型参数是否正确地实现了接口。此外,由于提供了编译后的执行文件,你可以直接运行程序来观察其效果,...

    泛型实例详解

    正确的方式是先创建非泛型数组,然后通过类型转换赋值给泛型引用: ```java List[] stringLists = (List[]) new List[]{new ArrayList()}; ``` 通过上述实例,我们可以了解到泛型在提高代码安全性和可读性方面...

    C#泛型接口实例

    在`Generic_InterfaceDemo`项目中,我们可以创建一个简单的程序,利用泛型接口处理不同类型的数据。例如,创建一个处理数字和字符串的类,并实现`IMyGenericInterface`: ```csharp public class NumberProcessor :...

    Asp.Net 泛型 三层

    泛型是.NET Framework 2.0引入的一种强大的特性,它允许开发者创建类型参数化的类、接口、方法和集合。这意味着,泛型可以为多种数据类型提供通用的代码实现,从而提高代码的复用性、性能和安全性。在Asp.Net中,...

    C#泛型实例Demo

    在你提供的"C#泛型实例Demo"文档中,很可能包含了如何使用这些泛型特性的示例代码。通过阅读和运行这些代码,你可以更深入地理解泛型在实际开发中的应用,比如如何创建自定义的泛型容器、如何利用泛型方法实现通用...

Global site tag (gtag.js) - Google Analytics