符合平等约束

时间:2018-02-18 12:56:06

标签: java generics

我写了一些通用方法。它适用于第一级后代。但它失败了二级后代的对象。

<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp"
android:background="@color/homebackground"
tools:context="com.test.test.HomeActivity">

<LinearLayout //CHANGE THIS TO RELATIVE LAYOUT
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center">

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    app:cardUseCompatPadding="true"
    app:cardCornerRadius="25dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="@font/open_sans"
            android:text="Text"
            android:textColor="@color/textColor"
            android:paddingTop="15dp"
            android:paddingStart="15dp"
            android:paddingEnd="15dp"
            android:paddingBottom="5dp"/>

        <View
            android:layout_width="290dp"
            android:layout_height="1dp"
            android:background="@color/gray" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="@font/open_sans"
            android:text="Text"
            android:textColor="@color/textColor"
            android:paddingTop="5dp"
            android:paddingStart="15dp"
            android:paddingEnd="15dp"
            android:paddingBottom="5dp"/>

        <View
            android:layout_width="290dp"
            android:layout_height="1dp"
            android:background="@color/gray" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="@font/open_sans"
            android:text="Text"
            android:textColor="@color/textColor"
            android:paddingTop="5dp"
            android:paddingStart="15dp"
            android:paddingEnd="15dp"
            android:paddingBottom="15dp"/>
    </LinearLayout>

</android.support.v7.widget.CardView>

//PLACE YOUR TITLE VIEW HERE 


</LinearLayout>

编译失败: 错误:(29,9)java:类com.company.Main中的方法f不能应用于

package com.company;

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static <T extends Comparable<T>> int f(List<T> list, T item) {
        return 0;
    }

    static class A implements Comparable<A> {
        @Override
        public int compareTo(A o) {
            return 0;
        }
    }

    static class B extends  A {
    }

    public static void main(String[] args) {
        List<A> as = new ArrayList<A>();
        List<B> bs = new ArrayList<B>();
        A a = new A();
        B b = new B();

        f(as, a); // works
        f(bs, b); // <-------- error
    }
}

为什么Java无法猜测等式变量类型?

1 个答案:

答案 0 :(得分:3)

您的函数T的类型参数f必须按照您的定义Comparable<T>实施<T extends Comparable<T>>B 实施Comparable<B>,而是Comparable<A>。如果您希望能够使用B调用该函数,则该类应实现Comparable<B>,例如像这样

static class B extends A implements Comparable<B> {
    @Override
    public int compareTo(B o) {
        return super.compareTo(o);
    }
}

否则,您可以更改f的类型参数,以便T成为Comparable类的子类。

public static <T extends Comparable<? super T>> int f(List<T> list, T item) {
    return 0;
}