这个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()
答案 0 :(得分: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();
}
}
值得注意的是,在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
可以表示扩展或实现。