【问题标题】:Making decision based on generic type in javajava中基于泛型类型的决策
【发布时间】:2020-07-09 07:23:30
【问题描述】:

我有一个通用类,它有一个方法 getOutput。我想根据 T 的类型(类类型)做出决定。我尝试了以下方法,但它不起作用。

class Test<T> implements Interface1<T> {

public T getOutput(String input) {
    
     if (T instanceof Class1) {
       //do something
     } else {
       //do something else
     }
}

}

【问题讨论】:

  • T 是您班级中的 something 类型,不是吗?这是您应该检查的内容,而不是 T 本身。
  • T 可以是字符串或整数。如果 T 是一个字符串,我将执行 action-1。如果 T 是 Integer,我将执行 action-2。
  • getOutput 本身返回T 类型的东西。你要返回什么?
  • 如果 T 是一个字符串,我会返回一个字符串对象。如果 T 是 Integer,我将返回一个 Integer 对象。
  • 如果您想知道它是什么,您必须将Class&lt;T&gt; 作为构造函数(或方法)参数传递。也就是说,这通常不是正确的做法,因为面向对象编程的全部意义在于你应该能够调用input.getWhatever(要么,要么你真的在寻找策略设计模式)。

标签: java oop generics design-patterns strategy-pattern


【解决方案1】:

Java 没有提供允许函数确定预期返回值的类型或如何立即使用它的运行时机制。泛型方法的类型参数在编译后被删除。

见:https://docs.oracle.com/javase/tutorial/java/generics/genMethods.html

您必须使用方法参数来传递预期类型:

interface Value {
    <T> T get(Class<T> tag);
}

class TheValue implements Value {
    @Override
    public <T> T get(final Class<T> tag) {
        if (tag.isAssignableFrom(String.class)) {
            return (T) "something";
        } else {
            return null;
        }
    }
}

【讨论】:

    【解决方案2】:

    我尝试了以下。你们有什么感想?如果您有更好的解决方案,请告诉我。我们还可以讨论使用策略模式等设计模式的解决方案。我需要这门课以不同的格式给出答案。说。字符串或整数...或 Class1 或 Class2(例如)

    class Test<T> implements Interface1<T> {
    
    public T getOutput(String input, Class<T> type) {
        
         if (type.isAssignableFrom(String.class)) {
           //do something
           String answer = "10"; // example answer
           return type.cast(answer); 
         } else {
           //do something else
         }
    }
    
    }
    

    【讨论】:

    • 如果在一个地方我想要一个List&lt;Integer&gt; 而在另一个地方一个List&lt;String&gt; 怎么办? ?
    • 这是一个不同的问题。让我们先解决这个问题。我的返回类型不是集合。
    • 此响应是正确的,它是在 Java 中执行此操作的唯一方法,但如果输出类型是泛型类型,则必须进行更改。而不是Class,您应该使用TypeToken,如下所示:guava.dev/releases/21.0/api/docs/com/google/common/reflect/…
    • 我唯一担心的是,使用 isAssignableFrom 会不会对性能造成影响?
    • @rascio 目前我没有使用 guava 库的选项。
    猜你喜欢
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多