【问题标题】:What is the Java equivalent of the C# generic constraint "T,K: where T : It<K>"?C# 泛型约束“T,K: where T: It<K>”的 Java 等价物是什么?
【发布时间】:2023-03-11 04:32:01
【问题描述】:

这个 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&lt;K&gt; 而不是扩展它。

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

在 C# 中是:

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

【问题讨论】:

  • T asyncThread = default(T);:这条线会给你带来一些麻烦。由于 Java 实现了带擦除的泛型,它在运行时不知道 T 是什么类型。
  • 如果您确实需要创建T 的实例,则必须以某种方式传递Class&lt;T&gt; 的参数才能创建该新对象。
  • 当在泛型中使用extends 时,T extendsimplements 后一个类/接口并不重要。关键字仍然是extends

标签: c# java generics equivalent


【解决方案1】:

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

对于实例化,您必须使用T 的类来创建它。因为您不能直接使用T.class,所以如果您需要创建模式的可重用性,您可以创建一个工厂,就像 corsiKa 建议的那样,或者您可以将Class&lt;T&gt; 传递给您的类的构造函数并保留该实例周围。

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) 会产生空引用,因此您的原始示例不正确。

【讨论】:

    【解决方案2】:

    您的&lt;T extends IAsyncThread&lt;K&gt;&gt; 是正确的。尽管类本身是实现而不是扩展,但通用定义的术语是扩展。如果你愿意,你可以使用&lt;T extends Object &amp; IAsyncThread&lt;K&gt;&gt;&lt;T extends Object, IAsyncThread&lt;K&gt;&gt;,但这是不必要的。

    要创建一个类型为 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();
        }
    }
    

    【讨论】:

      【解决方案3】:

      你的代码应该没问题:

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

      对于泛型,extends 可以表示扩展或实现。

      【讨论】:

        猜你喜欢
        • 2019-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-21
        • 2010-09-26
        • 2015-04-27
        • 2010-11-26
        相关资源
        最近更新 更多