Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Java与C“泛型约束”的等价物是什么;T、 K:其中T:它<;K>&引用;?_C#_Java_Generics_Equivalent - Fatal编程技术网

C# Java与C“泛型约束”的等价物是什么;T、 K:其中T:它<;K>&引用;?

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类创建一个

这个C#声明在Java中的等价物是什么

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
时,t
extends
实现后一个类/接口并不重要。关键字仍然是
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();
    }
}