5

这个 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()
4

3 回答 3

10

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

对于实例化,您必须执行一个模式,在其中使用类T来创建它。因为您不能直接使用T.class,所以如果您需要创建模式的可重用性,您可以像 corsiKa 建议的那样创建一个工厂,或者您可以将 aClass<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)用于类或接口将产生空引用,因此您的原始示例是不正确的。

于 2012-08-10T15:11:38.967 回答
5

<T extends IAsyncThread<K>>是正确的。尽管类本身是实现而不是扩展,但通用定义的术语是扩展。如果你愿意,你可以使用<T extends Object & IAsyncThread<K>>or<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();
    }
}
于 2012-08-10T15:13:32.747 回答
2

你的代码应该没问题:

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

对于泛型,extends可能意味着扩展或实现。

于 2012-08-10T15:12:55.160 回答