C# Java与C“泛型约束”的等价物是什么;T、 K:其中T:它<;K>&引用;?
这个C#声明在Java中的等价物是什么C# Java与C“泛型约束”的等价物是什么;T、 K:其中T:它<;K>&引用;?,c#,java,generics,equivalent,C#,Java,Generics,Equivalent,这个C#声明在Java中的等价物是什么 public class AsyncThreadPool<T, K> where T : IAsyncThread<K> { 我试过: public class AsyncThreadPool<T extends IAsyncThread<K>, K > Java中的泛型约束只有两个选项,扩展和超级,在这种情况下,扩展和实现之间没有区别。您的方法声明代码应该按原样工作 对于实例化,您必须使用T类创建一个
public class AsyncThreadPool<T, K> where T : IAsyncThread<K> {
我试过:
public class AsyncThreadPool<T extends IAsyncThread<K>, K >
Java中的泛型约束只有两个选项,
扩展
和超级
,在这种情况下,扩展和实现之间没有区别。您的方法声明代码应该按原样工作
对于实例化,您必须使用T
类创建一个模式。因为您不能直接使用t.class
,如果您需要创建模式的可重用性,您可以像corsiKa建议的那样创建一个工厂,或者您可以将类
传递到类的构造函数中并保留该实例
public class AsyncThreadPool<T extends IAsyncThread<K>, K>{
private final Class<T> clazz;
public AsyncThreadPool(Class<T> clazz){
this.clazz = clazz;
}
public void Start() throws InstantiationException, IllegalAccessException{
T instance = clazz.newInstance();
instance.StartAsyncRequest();
}
}
公共类异步线程池{
私人期末班;
公共异步线程池(clazz类){
this.clazz=clazz;
}
public void Start()引发实例化异常,IllegalAccessException{
T instance=clazz.newInstance();
instance.StartAsyncRequest();
}
}
还需要注意的是,在C#中,对类或接口使用
default(T)
将产生空引用,因此您的原始示例是不正确的。您的代码应该是正确的:
public class AsyncThreadPool<T extends IAsyncThread<K>, K >
公共类异步线程池
对于泛型,扩展可以表示扩展或实现。您的
是正确的。尽管类本身实现而不是扩展,但泛型定义的术语是扩展。如果需要,可以使用
或
,但这是不必要的
对于创建T类型的成员,您唯一真正可以使用的就是使用factory对象
public class AsyncThreadPool<T extends IAsyncThread<K>, K> {
private final AsyncThreadFactory<T> factory;
public ASyncThreadPool(AsyncThreadFactory<T> factory) {
this.factory = factory;
}
public void foo() {
T t = factory.createDefault();
t.startAsyncRequest();
}
}
公共类异步线程池{
私营工厂;
公共ASyncThreadPool(AsyncThreadFactory工厂){
这个工厂=工厂;
}
公共图书馆{
T=factory.createDefault();
t、 StartSyncrQuest();
}
}
T asyncThread=default(T)代码>:这一行会给你带来一些麻烦。由于Java使用擦除实现泛型,所以它不知道运行时t
是什么类型,为了创建新对象,您必须以某种方式传递一个Class
参数。在这样的泛型中使用extends
时,textends
或实现后一个类/接口并不重要。关键字仍然是extends
。
public class AsyncThreadPool<T extends IAsyncThread<K>, K >
public class AsyncThreadPool<T extends IAsyncThread<K>, K> {
private final AsyncThreadFactory<T> factory;
public ASyncThreadPool(AsyncThreadFactory<T> factory) {
this.factory = factory;
}
public void foo() {
T t = factory.createDefault();
t.startAsyncRequest();
}
}