Получение длины строки в Java-дженериках - PullRequest
0 голосов
/ 17 мая 2019

Я изучаю Java-дженерики, и я пытался написать очень простой код, который должен печатать тип параметра, в моем случае только для демонстрации, я пробую только тип String, все было нормально, пока я не напечатал класс типа, но для строкового типа, когда я использовал .length (), чтобы получить длину моей строки, он показал ошибку:

не может найти символ
System.out.println (obj1.length ()); // не работает

, поскольку класс class java.lang.String , почему мы не можем использовать .length () в обобщениях?

import java.util.*;
import java.lang.*;
public class GenericMethodTest {
   public static < E > void sumOfGenericValues(E obj1, E obj2) {
     System.out.println(obj1.getClass());
      System.out.println(obj1.length()); //dosen't work
   }

   public static void main(String args[]) {
      String fn = "JK", ln = "Rowling";
      sumOfGenericValues(fn, ln);
   }
}

Ответы [ 2 ]

2 голосов
/ 17 мая 2019

Это потому, что вы знаете, что это String, но компилятор и метод не могут знать, что получит в качестве аргумента типа.

Вы можете редактировать свой метод, чтобы, если он получает строку, он печаталего длинаДля этого сначала нужно привести объект в строку, чтобы можно было использовать методы строки.

 public static < E > void sumOfGenericValues(E obj1, E obj2) {
        System.out.println(obj1.getClass());
        if(obj1 instanceof String) {
            System.out.println(((String)obj1).length());
        }
 }
1 голос
/ 17 мая 2019

Метод не гарантирует, что он получает String.Вы можете получить String, изменив параметр типа E на E extends String

Пример:

public static <E extends String> void sumOfGenericValues(E obj1, E obj2) {
    System.out.println(obj1.length());
    System.out.println(obj2.length());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...