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)类或接口会产生空引用,因此您的原始示例不正确.
你 <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)
| 归档时间: |
|
| 查看次数: |
1191 次 |
| 最近记录: |