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

Ale*_*lex 4 c# java generics equivalent

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

public class AsyncThreadPool<T, K> where T : IAsyncThread<K> {
Run Code Online (Sandbox Code Playgroud)

并且IAsyncThread是一个界面

public interface IAsyncThread<T> 
{
    T GetAsyncUsedObject(); 
    void StartAsyncRequest();    
}
Run Code Online (Sandbox Code Playgroud)

我试过了 :

public class AsyncThreadPool<T extends IAsyncThread<K>, K  >
Run Code Online (Sandbox Code Playgroud)

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

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

在C#中它是:

T asyncThread = default(T);
asyncThread.StartAsyncRequest()
Run Code Online (Sandbox Code Playgroud)

Chr*_*non 10

Java中的通用约束只有两个选项,extends并且super在扩展和实现之间没有区别.您的方法声明代码应该按原样运行.

对于实例化,您必须使用类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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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


cor*_*iKa 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();
    }
}
Run Code Online (Sandbox Code Playgroud)