【问题标题】:inferred type arguments [Any,Int] do not conform to method's type parameter bounds [T <: Comparable[T],V <: T]推断类型参数 [Any,Int] 不符合方法的类型参数边界 [T <: Comparable[T],V <: T]
【发布时间】:2018-12-16 14:00:19
【问题描述】:
val PROP_FEMALE:IProperty[java.lang.Integer] = PropertyInteger.create("female", 0,1)

worldIn.setBlockState(pos, state.withProperty(PROP_FEMALE, if (isFemale) 1 else 0), 2)

我正在用 Scala 编写 Minecraft Forge 模组。我正在尝试为我的方块状态创建 PropertyInteger。这在普通 Java 中工作得很好。然而,事实证明 Scala 很难让它使用我认为是隐式类型?

由于某种原因,这会产生此错误。

Error:(53, 45) inferred type arguments [Any,Int] do not conform to method withProperty's type parameter bounds [T <: Comparable[T],V <: T]
  worldIn.setBlockState(pos, withAge(0).withProperty(PROP_FEMALE, if (createFemale || isFemale) 1 else 0))
Error:(53, 58) type mismatch;
 found   : net.minecraft.block.properties.IProperty[Integer]
 required: net.minecraft.block.properties.IProperty[T]
      worldIn.setBlockState(pos, withAge(0).withProperty(PROP_FEMALE, if (createFemale || isFemale) 1 else 0))

这里是withProperty 方法。

<T extends Comparable<T>, V extends T> IBlockState withProperty(IProperty<T> property, V value);

这里是PropertyInteger.create 方法

public static PropertyInteger create(String name, int min, int max)
{
    return new PropertyInteger(name, min, max);
}

这是所有PropertyInteger 类

public class PropertyInteger extends PropertyHelper<Integer>
{
    private final ImmutableSet<Integer> allowedValues;

    protected PropertyInteger(String name, int min, int max)
    {
        super(name, Integer.class);

        if (min < 0)
        {
            throw new IllegalArgumentException("Min value of " + name + " must be 0 or greater");
        }
        else if (max <= min)
        {
            throw new IllegalArgumentException("Max value of " + name + " must be greater than min (" + min + ")");
        }
        else
        {
            Set<Integer> set = Sets.<Integer>newHashSet();

            for (int i = min; i <= max; ++i)
            {
                set.add(Integer.valueOf(i));
            }

            this.allowedValues = ImmutableSet.copyOf(set);
        }
    }

    public Collection<Integer> getAllowedValues()
    {
        return this.allowedValues;
    }

    public boolean equals(Object p_equals_1_)
    {
        if (this == p_equals_1_)
        {
            return true;
        }
        else if (p_equals_1_ instanceof PropertyInteger && super.equals(p_equals_1_))
        {
            PropertyInteger propertyinteger = (PropertyInteger)p_equals_1_;
            return this.allowedValues.equals(propertyinteger.allowedValues);
        }
        else
        {
            return false;
        }
    }

    public int hashCode()
    {
        return 31 * super.hashCode() + this.allowedValues.hashCode();
    }

    public static PropertyInteger create(String name, int min, int max)
    {
        return new PropertyInteger(name, min, max);
    }

    public Optional<Integer> parseValue(String value)
    {
        try
        {
            Integer integer = Integer.valueOf(value);
            return this.allowedValues.contains(integer) ? Optional.of(integer) : Optional.absent();
        }
        catch (NumberFormatException var3)
        {
            return Optional.<Integer>absent();
        }
    }

    /**
     * Get the name for the given value.
     */
    public String getName(Integer value)
    {
        return value.toString();
    }
}

【问题讨论】:

    标签: scala types type-inference comparable


    【解决方案1】:

    那是一堵巨大的代码墙……

    我认为您的示例可以简化为以下两行:

    def withProperty[T <: Comparable[T], V <: T](k: T, v: V) = ()
    withProperty(42: java.lang.Integer, 42)
    

    它会导致一个非常相似的错误:

    错误:推断类型参数 [Any,Int] 不符合方法 withProperty 的类型参数界限 [T <: comparable t withproperty java.lang.integer :13:>

    错误:类型不匹配;

    找到:整数
    必需:T

    所以我认为显而易见的解决方法也应该适用于您的代码。

    简单地将第二个参数的类型明确地消除错误:

    withProperty(42: java.lang.Integer, (if (true) 1 else 0): java.lang.Integer)
    

    如果你把它转移回你的代码中,它应该看起来像这样:

    worldIn.setBlockState(
      pos, 
      state.withProperty(PROP_FEMALE, (if (isFemale) 1 else 0): java.lang.Integer), 
      2
    )
    

    【讨论】:

    • PropertyInteger 类来自 Minecraft 的内部代码,虽然很大,但它被包含在问题中以帮助理解问题。所以我不会真的保证包含多余的内容。
    猜你喜欢
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多