package basedao.test;
import java.lang.reflect.ParameterizedType;
//import java.lang.reflect.Type;
public abstract class SuperClass<T> {
private Class<T> clazz;
@SuppressWarnings("unchecked")
public SuperClass() {
clazz = (Class<T>) ((ParameterizedType) super.getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
public Class<T> getClazz() {
return clazz;
}
public void setClazz(Class<T> clazz) {
this.clazz = clazz;
}
/**
* 普通的非泛型类Class
* 泛型化的类Class<T>
* JDK中,普通的Class.newInstance()方法的定义返回Object,要将该返回类型强制转换为另一种类型;
* 但是使用泛型的Class<T>,Class.newInstance()方法具有一个特定的返回类型;
* @param args
*/
public static void main(String[] args) {
SuperClass<Person> superClass = new SubClass();
//1.得到泛型类T实际的完整类名
System.out.println(superClass.getClazz());
//2.得到泛型类T的对象
try {
System.out.println(superClass.getClazz().newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
//3.调用泛型类T的方法
try {
superClass.getClazz().newInstance().function();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
class SubClass extends SuperClass<Person> {
public SubClass() {
super();
}
}
class Person {
public Person() {
super();
}
public void function() {
System.out.println("function in Person.class...");
}
}
输出结果:
class basedao.test.Person
basedao.test.Person@10d448
function in Person.class...
分享到:
相关推荐
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </...
泛型集合(如`List<T>`)与非泛型集合(如`ArrayList`)相比,提供了更好的类型检查和性能。泛型集合避免了非泛型集合中的类型转换开销。 综上所述,C#泛型是一个强大的工具,它提高了代码的灵活性、复用性和效率...
print(vart, type(vart)) # 输出:1 <class 'int'> vart = (1,) print(vart, type(vart)) # 输出:(1,) <class 'tuple'> ``` 此外,元组的定义并不总是需要括号。下面的定义方式也是有效的: ```python vart = 1,...
相比之下,泛型集合如List<T>提供了更强的类型安全性,T代表了集合中元素的类型。 **泛型**是C#中一个强大的特性,它允许我们在定义类、接口、方法和委托时引入类型参数,以实现更灵活和高效的代码。泛型集合如List...
不过,当需要更复杂的排序逻辑或者需要复用比较逻辑时,`IComparer<T>`提供了更大的灵活性。选择哪种方法取决于具体项目的需求和开发者的个人喜好。希望这篇文章能帮助到你理解和运用这些排序方法。感谢对本文的支持...
在C++编程中,数据结构和算法是两个非常重要的概念,它们构成了软件开发的基础。数据结构是用来组织和存储数据的方式,而算法则是解决问题的具体...理解并能灵活运用这些知识,将使你在解决实际问题时更加得心应手。
集合初始化器特别适用于 `System.Collections.Generic.ICollection<T>` 及其子类型,例如 `List<T>` 或 `Dictionary<TKey, TValue>`。下面是一个使用集合初始化器创建并初始化 `List<string>` 的例子: ```csharp ...
与更强大的`str.format()`方法或`f-string`相比,`string.Template`允许用户自定义变量的标识方式,这使得它在某些场景下更为灵活。 #### `string.Template`类的基本用法 `string.Template`类的核心功能是通过识别...
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> <File name="File" fileName="logs/app.log"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5...
C#的泛型列表(List<T>)、队列(Queue<T>)和字典(Dictionary<TKey, TValue>)等都是泛型容器的典型示例。 10. 异常处理: C#中的异常处理机制使用try-catch-finally语句块。当程序抛出异常时,相应的catch块可以...
这里使用了`Lazy<T>`类来实现延迟加载的功能,确保属性只在首次访问时执行初始化操作。 #### 技巧三:使用Producer/Consumer模式与委托 Producer/Consumer模式是一种常见的编程模式,它通常涉及到生产者和消费者两...
为了解决这个问题,C#引入了System.Collections泛型容器,如List<T>、Dictionary<TKey, TValue>等,它们不仅提供了强类型安全,还支持动态调整大小,提高了性能和代码可读性。 文件操作是任何应用程序中的常见任务...
3. 构造器(Constructor):`Constructor` 类代表类的构造方法,`Constructor<T>.getDeclaredConstructors()` 可以获取类的所有构造器,然后根据需求进行实例化。 4. 方法(Method):`Method` 类代表类的方法,...
this.stack = new ArrayList<>(); } public void push(T item) { stack.add(item); } public T pop() { if (stack.isEmpty()) { throw new EmptyStackException(); } return stack.remove(stack.size...
std::wcout << L"名字:" << person->name << L" 年龄:" << person->age << std::endl; } ``` 要使用JNA调用此函数,我们需要定义一个对应的Java结构体: ```java public class Person extends Structure { ...
例如,`ArrayList<T>`中的`T`就是一个类型参数,可以在使用时指定具体的类型。 8. **枚举**:`enum`关键字定义了枚举类型,它是一种特殊的类,常用于表示固定数量的值,如星期、状态等。 9. **并发工具类**:`java...
template <class T> class SeqQueue { public: SeqQueue() { maxSize = 50; element = new T[maxSize]; front = 0; rear = 0; } ~SeqQueue() { delete[] element; } bool EnQueue(const T& x); bool DeQueue(T& ...
for (auto i : fibonacci() | ranges::views::take_while([](uint64_t x) { return x < 10000; })) { cout << i << endl; } for (auto i : fibonacci() | ranges::views::take(20)) { cout << i << endl; } ``` ...
function identity<T>(arg: T): T { return arg; } ``` #### 模块 ```typescript export class Calculator { add(a: number, b: number) { return a + b; } } // 导入模块 import { Calculator } from './...
o m m u n i c a t i n go b j e c t)的重复模式。这些模式解决特定的设计问题,使面向对象设计更灵活、优雅,最终复用性更 好。它们帮助设计者将新的设计建立在以往工作的基础上,复用以往成功的设计方案。 一个...