Generics Scala类型推断并获得两个类型参数中更具体的作为方法结果

Generics Scala类型推断并获得两个类型参数中更具体的作为方法结果,generics,scala,type-inference,Generics,Scala,Type Inference,我想做的是定义类上的条件,包括继承。如果两个条件为and ed(或or ed),则结果应为更具体类上的条件,即查询条件。 所以如果我有 class Parent class Sub extends Parent class SubSub extends Sub 一个条件[Sub]和条件[Parent]以及条件[SubSub]应该产生一个条件[SubSub]。 条件也应该是逆变的,因为父项上的条件也应该是子项上的条件。因此我定义了(AnyRef是一个附加的外部约束): 工作。我遇到了中缀调用的方

我想做的是定义类上的条件,包括继承。如果两个条件为and ed(或or ed),则结果应为更具体类上的条件,即查询条件。 所以如果我有

class Parent
class Sub extends Parent
class SubSub extends Sub
一个
条件[Sub]和条件[Parent]以及条件[SubSub]
应该产生一个
条件[SubSub]
。 条件也应该是逆变的,因为父项上的条件也应该是子项上的条件。因此我定义了(AnyRef是一个附加的外部约束):

工作。我遇到了中缀调用的方法和问题,并提出了上述定义,该定义也适用于:

val b: Condition[SubSub] = 
   new Condition[Parent] and 
     new Condition[SubSub] and 
     new Condition[Sub]
。。。有点,因为它在出现第四种情况时停止工作:

val c: Condition[SubSub]=
  new Condition[Parent] and 
    new Condition[SubSub] and 
    new Condition[Sub] and 
    new Condition[Parent]
导致“无”推断:

error: inferred type arguments
[com.solvedirect.test.SubSub,com.solvedirect.test.SubSub,com.solvedirect.test.Parent]
do not conform to method and's type parameter bounds 
[R <: Nothing,R <: R,P >: R <: AnyRef]
错误:推断的类型参数
[com.solvedirect.test.SubSub,com.solvedirect.test.SubSub,com.solvedirect.test.Parent]
不符合方法和的类型参数界限

[R首先,我想让您注意一个事实,即拥有一个无法推断的泛型参数是很奇怪的,因为它不包含任何关于类中包含的数据的信息。如果它包含,那么它将是可推断的

如果不明确指定返回类型,则可以推断参数。由于Scala中的中缀运算符(除非以:)是左关联的,因此在该语句中:

val c:Condition[SubSub] = new Condition[Parent] and new Condition[SubSub] and
  new Condition[Sub] and
  new Condition[Parent]
编译器的工作方式如下:

 ((new Condition[Parent] and new Condition[SubSub]) and
  new Condition[Sub]) and
  new Condition[Parent])
因此,您最终会遇到以下情况:

  • 第一个条件[Parent]和条件[SubSubSub]之间的条件返回一个无法推断且未指定的类型,因此它是UnknownType1
  • 第二个也是相同的:它是介于UnknownType1和条件[Sub]之间的and,返回UnknownType2
  • 第三个接受UnknownType2和条件[Parent]。在这里,编译器无法检查约束保持
请注意,对于三个操作数和:

 val b: Condition[SubSub] =
new Condition[Parent] and
  new Condition[SubSub] and
  new Condition[Sub]
编译器使用b类型来推断中间结果的类型(父级和子级),并可以检查边界

在失败的情况下,编译器将需要推断两次结果,但它无法这样做

回到最初的注释,还请注意,在简单的情况下,如果不指定结果,编译器也会失败,这通常是类设计不佳的标志


val e=new Condition[Parent]和new Condition[subsubsub]

首先,我想让您注意一个事实,即拥有一个无法推断的泛型参数是很奇怪的,因为它不包含任何关于类中包含的数据的信息。如果是,那么它将是可推断的

如果不明确指定返回类型,则可以推断参数。由于Scala中的中缀运算符(除非以:)是左关联的,因此在该语句中:

val c:Condition[SubSub] = new Condition[Parent] and new Condition[SubSub] and
  new Condition[Sub] and
  new Condition[Parent]
编译器的工作方式如下:

 ((new Condition[Parent] and new Condition[SubSub]) and
  new Condition[Sub]) and
  new Condition[Parent])
因此,您最终会遇到以下情况:

  • 第一个条件[Parent]和条件[SubSubSub]之间的条件返回一个无法推断且未指定的类型,因此它是UnknownType1
  • 第二个也是相同的:它是介于UnknownType1和条件[Sub]之间的and,返回UnknownType2
  • 第三个接受UnknownType2和条件[Parent]。在这里,编译器无法检查约束保持
请注意,对于三个操作数和:

 val b: Condition[SubSub] =
new Condition[Parent] and
  new Condition[SubSub] and
  new Condition[Sub]
编译器使用b类型来推断中间结果的类型(父级和子级),并可以检查边界

在失败的情况下,编译器将需要推断两次结果,但它无法这样做

回到最初的注释,还请注意,在简单的情况下,如果不指定结果,编译器也会失败,这通常是类设计不佳的标志


val e=新条件[Parent]和新条件[SubSubSub]

我现在尝试用交集结果类型定义
方法如下:
def和[PI]我现在尝试用交集结果类型定义
方法如下:
def和[p