类型推断在类型擦除上的作用 - 如果类型推断在类型擦除上运行良好,则可以使用通配符边界?

时间:2018-02-26 01:48:47

标签: java generic-programming

致力于满足特定需求。大多数在线教程都讨论了如何将通配符实现应用于集合。在下面的例子中,extends工作正常但是当我使用通配符边界获取错误时应用super。我想用超级类型限制一个方法,如下例所示。我应该知道的超级有限制吗?

class SuperClass3 {
            public void display() {
                System.out.println("This is display3 method");
            }

        }


        class SuperClass2 extends SuperClass3 {
            public void display() {
                System.out.println("This is display2 method");
            }

        }

        class SuperClass1 extends SuperClass2 {
            public void display() {
                System.out.println("This is display1 method");
            }
        }

扩展效果很好(类型边界不带通配符边界)...

public <T extends SuperClass2> void displayOutput(T obj) {
        obj.display();
    }

尝试对超级不工作做同样的事情。在方法签名上抛出编译错误。

public <T super SuperClass2> void displayOutputWithSuper(T obj) {
        //obj.display();
    }

Complete Example ...

package com.tutorial.generic.bounds.wildcard;

import java.util.List;

public class UpperBoundWildcardExample {

    class SuperClass3 {
        public void display() {
            System.out.println("This is display3 method");
        }

    }

    class SuperClass2 extends SuperClass3 {
        public void display() {
            System.out.println("This is display2 method");
        }

    }

    class SuperClass1 extends SuperClass2 {
        public void display() {
            System.out.println("This is display1 method");
        }
    }

    public <T extends SuperClass2> void displayOutput(T obj) {
        obj.display();
    }

    public void addData(List<? extends SuperClass2> data) {

    }

    public <T super SuperClass1> void displayOutputWithSuper(T obj) {
        obj.toString();
    }

    /*
     * This wont work 
     * 
     * public void addData(<? extends SuperClass2> data){
     * 
     * }
     */

    public static void main(String[] args) {
        UpperBoundWildcardExample obj = new UpperBoundWildcardExample();
        // Oops!!! Error
        // obj.displayOutput(obj.new SuperClass3());
        // It suppports SuperClass2 & which extends SuperClass2
        obj.displayOutput(obj.new SuperClass2());
        obj.displayOutput(obj.new SuperClass1());
    }
}

1 个答案:

答案 0 :(得分:0)

@Shaan 这可能会有所帮助

Bounding generics with 'super' keyword

让我们说你有这个通用的方法声明:

<T super Integer> void add(T number) // hypothetical! currently illegal in Java

你有这些变量声明:

Integer anInteger
Number aNumber
Object anObject
String aString

你的意图(如果它是合法的)是它应该允许add(anInteger)和add(aNumber),当然还有add(anObject),但不能添加(aString)。好吧,String是一个Object,所以add(aString)仍然会编译。