对应于扩展超级内部类的内部类的方法的参数类型

时间:2018-02-16 14:42:47

标签: java android kotlin

我有一些结构如下的课程:

class A {
    inner class B {}

    void func(B param) {}
}

class Asub extends A {
    inner class B extends A.B {}

    @Override
    void func(B param) {}      // problematic line
}

但编译器不允许它作为正确的覆盖,只有在我改变时才允许它(在Asub中)

void func(B param)

void func(A.B param)

但是我不想这样做,因为我在Asub.B中定义了一些我想要使用的覆盖功能,但如果我将param类型更改为A.B而不是B,linter告诉我Asub.B未使用

我很感激在解决这个问题方面有任何帮助,或者如果不可能,我会感谢一种可能的替代方法来实现我想要的功能

此问题的实际情况与Android RecyclerView.AdapterViewHolder有关,但我认为问题不在那里

3 个答案:

答案 0 :(得分:2)

这与内部类无关,这里的问题是你不能用f覆盖函数f(A)(B扩展A),因为所有被重写的方法都必须能够接受所有允许的参数对于超级方法。

当然,你总是可以在重写方法中转换为子类型。

答案 1 :(得分:2)

这个问题到底是什么语言? extendsvoid@Override是Java,而inner class是Kotlin。

除此之外,覆盖一个函数然后限制它可以作为参数的内容是没有意义的。当有人这样做时你会发生什么?

A asub = new Asub();
asub.func(new A.B());

如果你得到了你想要的东西,这个函数调用将不再有效 - 这违反了Liskov substitution principle,这基本上规定了" 期望不再,提供不少于& #34 ;.幸运的是,Java或Kotlin都不允许这样做。

答案 2 :(得分:1)

我相信你最好的拍摄是使用泛型。

的内容
// Items to populate Simulator Transaction Type List!r
private class Item 
{
    public string Name;

    public Item(string name)
    {
        Name = name;
    }
    public override string ToString()
    {
        // Generates the text shown in the combo box
        return Name;
    }
}

public void btnAddSimFields_Click(object sender, RoutedEventArgs e)
{    
    var newTypeBox = new ComboBox();
    {
        newTypeBox.Height = 22;
        newTypeBox.Width = 137;
        newTypeBox.Margin = new Thickness(10, 90, 323, 0);
        newTypeBox.VerticalAlignment = VerticalAlignment.Top;
        newTypeBox.Text = "Select an Action...";
        newTypeBox.IsEditable = true;
        newTypeBox.Items.Add(new Item("Buy"));
        newTypeBox.Items.Add(new Item("Sell"));
        newTypeBox.Items.Add(new Item("Sell Full Amount"));
    }
    var newCoinBox = new ComboBox();
    {
        newCoinBox.Height = 22;
        newCoinBox.Width = 137;
        newCoinBox.Text = "Select a coin";
        newCoinBox.VerticalAlignment = VerticalAlignment.Top;
        newCoinBox.Margin = new Thickness(166, 90, 167, 0);
        newCoinBox.ItemsSource = cmbListCoins.Items;
        newCoinBox.IsEditable = true;

    }

    var newWaterMark = new WatermarkTextBox();
    {
        newWaterMark.Height = 22;
        newWaterMark.Width = 120;
        newWaterMark.HorizontalAlignment = HorizontalAlignment.Left;
        newWaterMark.VerticalAlignment = VerticalAlignment.Top;
        newWaterMark.Margin = new Thickness(323, 90, 27, 0);
        newWaterMark.Watermark = "Quantity...";
    }


    gridSimBoxes.Children.Add(newTypeBox);
    gridSimBoxes.Children.Add(newCoinBox);
    gridSimBoxes.Children.Add(newWaterMark);
}

应该可以胜任。