什么是C#泛型约束“T,K:其中T:It <k>”的Java等价物?</k>

时间:2012-08-10 15:01:53

标签: c# java generics equivalent

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

public class AsyncThreadPool<T, K> where T : IAsyncThread<K> {

IAsyncThread是一个接口

public interface IAsyncThread<T> 
{
    T GetAsyncUsedObject(); 
    void StartAsyncRequest();    
}

我试过了:

public class AsyncThreadPool<T extends IAsyncThread<K>, K  >

但是不正确,因为T实现IAsyncThread<K>没有扩展它。

我需要在这堂课中使用T.StartAsyncRequest()或类似的

在C#中它是:

T asyncThread = default(T);
asyncThread.StartAsyncRequest()

3 个答案:

答案 0 :(得分:10)

Java中的通用约束只有两个选项,extendssuper,在这种情况下,扩展和实现之间没有区别。您的方法声明代码应该按原样运行。

对于实例化,您必须使用T类来创建它。因为你不能直接使用T.class,你可以像corsiKa建议的那样创建一个工厂,如果你需要创建模式的可重用性,或者你可以将Class<T>传递给你的类的构造函数并保持这个实例。

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();
    }
}

值得注意的是,在C#中,对类或接口使用default(T)会产生空引用,因此原始示例不正确。

答案 1 :(得分:5)

您的<T extends IAsyncThread<K>>是正确的。即使类本身实现而不是扩展,通用定义的术语也会扩展。如果您愿意,可以使用<T extends Object & IAsyncThread<K>><T extends Object, IAsyncThread<K>>,但这是不必要的。

要创建T类型的成员,您唯一可以使用的是使用工厂对象。

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();
    }
}

答案 2 :(得分:2)

您的代码应该没问题:

public class AsyncThreadPool<T extends IAsyncThread<K>, K  >

使用泛型,extends可以表示扩展或实现。