我有两个基本相同的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我可以定义实际上直接使用+和-操作成员?
我想要这样的东西:
public static TTo JumpTo<TFrom, TTo>(this TFrom from_page)
where TTo : new() TFrom : new()
{
...
}
Run Code Online (Sandbox Code Playgroud)
我想强制说TFrom和TTo都是从基类型派生的.
我想把这个方法作为TFrom类型的扩展方法.
可能吗 ?什么是正确的语法?
public interface ICloneable<T>
{
T Clone();
}
public Foo: ICloneable<Foo>
{
public Foo Clone()
{
//blah
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法约束T实现接口的类型?(Foo在这种情况下).强制执行任何实现ICloneable以返回其自身实例,而不是任何随机类型.
我不确定这两个签名是否有任何真正的区别:
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)
我认为这些操作几乎完全相同,但我不太确定......我在这里俯瞰什么?
我对.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 {,但没用
假设我有一堂课
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<>方法仅适用于它,而不适用于其他任何接口?
我试图将一个通用列表传递给一个函数,该函数将一个新项添加到列表中.我有以下剥离示例:
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"
非常感谢任何指针.