标签: generic-constraints

scala类型签名允许成员上的数字操作

我有两个基本相同的case类,除了一个有Int和另一个Double成员.我正在尝试创建一个共同的特征,我可以用它来操作任何一个函数并允许基本的数字操作.但到目前为止,我无法弄清楚如何使用Numeric或Ops类型:

trait Sentiment[A] {
  def positive: A
  def negative: A
}

case class IntSentiment(positive: Int, negative: Int) extends Sentiment[Int]
Run Code Online (Sandbox Code Playgroud)

我想提出一个函数约束,以便我可以对成员执行数字操作,类似于:

def effective[A](sentiment: Sentiment[A]): A = {
  sentiment.positive - sentiment.negative
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,我想我需要以Numeric某种方式调用类型类,但我最接近的是:

def effective[A](sentiment: Sentiment[A])(implicit num: Numeric[A]): A = {
  num.minus(sentiment.positive,sentiment.negative)
}
Run Code Online (Sandbox Code Playgroud)

是否有类型约束/签名Sentiment和/或effective我可以定义实际上直接使用+-操作成员?

scala typeclass generic-constraints

2
推荐指数
1
解决办法
302
查看次数

如何为类型参数添加2个new()约束?

我想要这样的东西:

public static TTo JumpTo<TFrom, TTo>(this TFrom from_page) 
       where TTo : new() TFrom : new()
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想强制说TFrom和TTo都是从基类型派生的.

我想把这个方法作为TFrom类型的扩展方法.

可能吗 ?什么是正确的语法?

.net c# generics syntax generic-constraints

1
推荐指数
1
解决办法
121
查看次数

有没有办法将通用接口约束到实现它的类型?

public interface ICloneable<T>
{
    T Clone();
}

public Foo: ICloneable<Foo>
{
    public Foo Clone()
    { 
       //blah
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法约束T实现接口的类型?(Foo在这种情况下).强制执行任何实现ICloneable以返回其自身实例,而不是任何随机类型.

c# generics interface generic-constraints

1
推荐指数
1
解决办法
100
查看次数

针对通用接口创建扩展方法还是作为通用约束?

我不确定这两个签名是否有任何真正的区别:

public static class MyCustomExtensions
{
    public static bool IsFoo(this IComparable<T> value, T other)
        where T : IComparable<T>
    {
        // ...
    }

    public static bool IsFoo(this T value, T other)
        where T : IComparable<T>
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这些操作几乎完全相同,但我不太确定......我在这里俯瞰什么?

c# generics extension-methods interface generic-constraints

0
推荐指数
1
解决办法
2847
查看次数

C# 在“where TEntity : class”上实现接口

我对.NET比较陌生,并且偶然发现了这个特定问题:在遵循存储库模式教程时,该类的定义如下所示:

public class GenericRepository<TEntity> where TEntity : class { ...
Run Code Online (Sandbox Code Playgroud)

话虽这么说,这个类应该实现一个接口。既然我已经使用了该:运算符,我该怎么做呢?

public class GenericRepository<TEntity> : IGenericRepository where TEntity : class {也尝试过public class GenericRepository<TEntity> where TEntity : class : IGenericRepository {,但没用

c# generics interface generic-constraints

0
推荐指数
1
解决办法
3074
查看次数

IComparable &lt;&gt;作为通用约束有何特别之处

假设我有一堂课

Class Apple<T> where T: IComparable<int>{}
Run Code Online (Sandbox Code Playgroud)

现在,在为Apple创建对象时,我会像

Apple<int> obj = new Apple<int>();
Run Code Online (Sandbox Code Playgroud)

上面的代码将起作用。

如果我将相同的代码替换为其他通用接口(例如)IComparer<>IEnumerable<>则上述对象创建将无法正常工作,我们必须像这样声明它

Apple<IEnumerable<int>> obj = new Apple<IEnumerable<int>>();
Run Code Online (Sandbox Code Playgroud)

为什么会这样呢?为什么我声明的IComparable<>方法仅适用于它,而不适用于其他任何接口?

.net c# generics generic-constraints

0
推荐指数
1
解决办法
62
查看次数

通用方法将新T添加到T列表中

我试图将一个通用列表传递给一个函数,该函数将一个新项添加到列表中.我有以下剥离示例:

   private void SetBayNumb<T>(ObservedList<T> bayList) where T : IBaySpec, new()
   {
     var bay = new T();
     bayList.Add(bay);
   }
Run Code Online (Sandbox Code Playgroud)

调用它的方法有这个错误:

T' must have a public parameterless constructor in order to use it as parameter泛型类型或方法中的类型T'

我想做的是什么?我觉得它必须是因为编译器不应该关心它是什么类型的列表 - 它只需要调用public,无参数构造函数并将新实例添加到传入的现有列表中.

我猜测问题是接口不保证它的实现者将有一个公共构造函数,但即使我给它一个具体的类我得到这个错误:

类型T' must be convertible toBayClass',以便在泛型类型或方法中将其用作参数"T"

非常感谢任何指针.

c# generics generic-constraints

-3
推荐指数
1
解决办法
149
查看次数